Avant de commencer.
Utiliser boost::threads
Si vous voulez savoir comment le faire avec les pthreads, vous devez utiliser les variables de condition des pthreads. Celles-ci vous permettent de suspendre les threads qui attendent du travail sans consommer de CPU.
Lorsqu'un élément de travail est ajouté à la file d'attente, vous signalez la variable de condition et un pthread sera libéré de la variable de condition, ce qui lui permettra de prendre un élément de la file d'attente. Lorsque le thread a fini de traiter l'élément de travail, il retourne à la variable de condition pour attendre le prochain élément de travail.
La boucle principale pour les fils de la boucle devrait ressembler à ceci ;
ThreadWorkLoop() // The function that all the pool threads run.
{
while(poolRunnin)
{
WorkItem = getWorkItem(); // Get an item from the queue. This suspends until an item
WorkItem->run(); // is available then you can run it.
}
}
GetWorkItem()
{
Locker lock(mutex); // RAII: Lock/unlock mutex
while(workQueue.size() == 0)
{
conditionVariable.wait(mutex); // Waiting on a condition variable suspends a thread
} // until the condition variable is signalled.
// Note: the mutex is unlocked while the thread is suspended
return workQueue.popItem();
}
AddItemToQueue(item)
{
Locker lock(mutex);
workQueue.pushItem(item);
conditionVariable.signal(); // Release a thread from the condition variable.
}