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
Respuesta
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--;
}
}
}
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
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
¿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? –
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.
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
@Michael ¿Con qué recursos está tratando de proteger el acceso con su exclusión mutua? –
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
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>
así que 'magic_switch()' es atómico? –
- 1. Exclusión mutua PHP (mutex)
- 2. exclusión mutua y semáforos
- 3. Cassandra bloqueo de exclusión mutua (sincronización)
- 4. boost lanzamiento de exclusión mutua (impar?) Excepción
- 5. pthread_cond_wait y requisito de exclusión mutua
- 6. ¿Diferencia entre exclusión mutua y sincronización?
- 7. Subprocesos asincrónicos y sesión
- 8. ARM cortex: exclusión mutua utilizando el bit de bandas
- 9. El implemento de exclusión mutua en el SICP Sección 3.4
- 10. .NET subprocesos de trabajo de Threadpool y subprocesos de I/O asincrónicos
- 11. Algoritmo para la exclusión de los números
- 12. Modelo híbrido de subprocesos (M: N) Implementación
- 13. con recursión mutua
- 14. IOS autenticación mutua
- 15. Cómo administrar subprocesos M (1 por tarea) asegurando solo N subprocesos al mismo tiempo. Con N <M. En Java
- 16. métodos asincrónicos en NSOperation
- 17. Idiomas síncronos vs asincrónicos
- 18. zsh para la exclusión de bucle
- 19. Información mutua de MATLAB Matrix
- 20. Autenticación mutua con servicios web
- 21. Soldadura: observadores de eventos asincrónicos
- 22. Servlets asincrónicos vs servlets síncronos
- 23. Exclusión de Solr en stats.field?
- 24. Utilice delegados asincrónicos o ThreadPool.QueueUserWorkItem para el paralelismo masivo?
- 25. ¿Por qué los subprocesos comparten el espacio de montón?
- 26. Defypes de referencia mutua en Clojure
- 27. Procesos de fondo asincrónicos en Python?
- 28. Anuncios de Google asincrónicos versus Sincrónico
- 29. Redraw UITableView después de actualizar datos asincrónicos
- 30. jQuery AJAX: recopilar resultados asincrónicos múltiples
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. –