2010-09-12 14 views
7

Tengo una aplicación asincrónica, lo que significa que en un momento dado puede haber N eventos. ¿Existe un algoritmo conocido para realizar exclusión mutua para N subprocesos, sin hardcoding cada hilo para tener una ID?Exclusión mutua para N subprocesos asincrónicos

+0

Un ejemplo de la necesidad de esto sería el uso de almacenamiento local, que es no transaccional y por lo tanto no es seguro si la misma página se abre en varias pestañas . Implementar el comportamiento mutex con un trabajador compartido podría evitar esa limitación. –

Respuesta

5

No creo que Javascript per se tenga bloqueo de objeto, porque Javascript es básicamente de subproceso único. Es posible que pueda encontrar una biblioteca o implementación que ejecute varios hilos de código Javascript, pero ¿se están ejecutando todos en el mismo espacio variable? Tendrán que comunicarse entre ellos de alguna manera.

Suponiendo sus múltiples hilos pueden compartir un mutex variable estática alguna manera, y en la medida en que asumir '++' se considera una operación atómica para el sistema que está haciendo su roscado, ¿qué tal esto?

int mutex = 0; 
mutuallyExclusiveOperation(){ 
    succeed=false; 
    while(!succeed){ 
    while(mutex>0){ sleep(); } 
    m=mutex++; //"Simultaneously" read and increment 
    if(m>0)mutex--; 
    else{ 
     doMutuallyExclusiveThing(); 
     succeed=true; 
     mutex--; 
    } 
} 
} 
+0

Puedo hacer una variable estática sin problema, mi preocupación no era No estaba seguro de que ++ _Tes_ una operación atómica. ¿Sabes si este es el caso de JS? Si eso es cierto, este problema es (creo) solucionable. Su función parece que lo hace correctamente, en realidad. – Michael

+0

A partir de hoy, Chrome ya no tiene un solo hilo. Pruebe este ejemplo, usará el 100% de su procesador: http://jsfiddle.net/MTJ27/15/ – darkzangel

+0

¿Se puede usar el código que proporcionó tal cual? Quiero decir que es totalmente correcto y se puede usar en modo de producción? –

3

JavaScript es generalmente de una sola hebra, por lo que nunca tiene dos piezas de código que modifiquen los mismos datos al mismo tiempo. Puede utilizar varios subprocesos en los navegadores modernos usando Web Workers, pero solo pueden comunicarse pasando mensajes, no compartiendo memoria, por lo que no necesita preocuparse por la exclusión mutua si está utilizando web workers.

+0

En realidad, estoy utilizando web workers, pero eso no viene al caso. Mi preocupación es si la función onMessage se llama dos veces. Si bien puede ser de "un único subproceso", ¿no enrutará las dos llamadas intermitentemente, si terminan ejecutándose en el mismo período de tiempo? – Michael

+0

@Michael ¿Con qué recursos está tratando de proteger el acceso con su exclusión mutua? –

+0

Digamos que tengo una matriz global, y necesito almacenar algo en ella, y devolver el índice del artículo almacenado. Normalmente, verificaría la longitud, la insertaría en la matriz y devolvería la longitud de la matriz. Pero si el segundo subproceso (que se llamó debido a un evento asincrónico) se enhebra entre la obtención de la longitud de la matriz y empuja el nuevo valor en la matriz, y hace lo mismo, la primera función devolverá el índice incorrecto. – Michael

2

Puede ser de un solo subproceso, pero a veces hay un problema cuando algunas acciones del usuario ejecutan varios subprocesos que nos gustaría evitar (por ejemplo, las solicitudes AJAX). Si quisiéramos hacer un semáforo, podemos usar una variable global. De todos modos, estoy seguro de que no debería hacerse de esta manera, simplemente no conozco ninguna solución mejor ya que no estoy involucrado en JS tanto.

Esperamos que te ayude en algunas situaciones simples:

<html> 

<head> 
    <script type="text/javascript"> 
     var magic_global; 
     magic_global = true; 

     function magic_switch() { 
       magic_global = !magic_global; 
     } 
    </script> 
</head> 

<body> 
     <a href="#" onclick="magic_switch();">switch Magic</a> 
     <a href="#" onclick="alert(magic_global);">show the Magic</a> 
</body> 

</html> 
+0

así que 'magic_switch()' es atómico? –

Cuestiones relacionadas