Прежде чем я начну.
Используйте boost :: threads
Если вы хотите знать, как это сделать с помощью pthread, вам необходимо использовать условные переменные pthread. Это позволяет вам приостанавливать потоки, ожидающие работы, без использования процессора.
Когда элемент работы добавляется в очередь, вы сигнализируете переменную условия, и одна переменная освобождается от переменной условия, что позволяет ему извлекать элемент из очереди. Когда поток завершает обработку рабочего элемента, он возвращается к условной переменной, чтобы дождаться следующей части работы.
Основной цикл для потоков в цикле должен выглядеть следующим образом;
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.
}