Estoy a punto de implementar un hilo de trabajo con cola de elementos de trabajo, y mientras pensaba en el problema, quería saber si estoy haciendo lo mejor.Primitiva de sincronización más liviana para la fila de hilos del trabajador
El hilo en cuestión tendrá que tener algunos datos locales de subprocesos (preinicializados en la construcción) y hará un bucle en los elementos de trabajo hasta que se cumpla alguna condición.
pseudocódigo:
volatile bool run = true;
int WorkerThread(param)
{
localclassinstance c1 = new c1();
[other initialization]
while(true) {
[LOCK]
[unqueue work item]
[UNLOCK]
if([hasWorkItem]) {
[process data]
[PostMessage with pointer to data]
}
[Sleep]
if(!run)
break;
}
[uninitialize]
return 0;
}
supongo que haré el bloqueo a través de la sección crítica, como se std :: vector de la cola o std :: cola, pero tal vez hay una mejor manera.
La parte con suspensión no parece demasiado grande, ya que habrá una gran cantidad de sueño adicional con grandes valores de reposo, o mucho bloqueo extra cuando el valor de reposo es pequeño, y eso es definitivamente innecesario.
Pero no puedo pensar en una primitiva amistosa WaitForSingleObject que podría utilizar en lugar de una sección crítica, ya que podría haber dos hilos en cola de elementos de trabajo al mismo tiempo. Así que Event, que parece ser el mejor candidato, puede perder el segundo elemento de trabajo si el Evento ya se estableció, y no garantiza una exclusión mutua.
Quizás haya incluso un mejor enfoque con el tipo de funciones InterlockedExchange que conduzca a una serialización aún menor.
P.S .: Puede que necesite preprocesar toda la cola y soltar los elementos de trabajo obsoletos durante la etapa de desencadenamiento.
Si el bloqueo y el desbloqueo no es caro, se está llevando a cabo el sueño es un problema? – DumbCoder
La serialización de 3 o 4 hilos, la grabación de la CPU y, posiblemente, la ejecución de cerraduras de convoyes, probablemente no sea algo muy bueno. Y si entiendo correctamente esto es lo que sucederá sin Sleep o WaitForSingleObject. Por otra parte, tal vez estoy equivocado. – Coder
¿Cómo se entregan los elementos de trabajo a la cola? –