В моем приложении есть основной поток, который назначает задачи нескольким рабочим потокам. Схема связи следующая:
Функция потока (работа здесь является указателем функции):
while(true) {
pthread_mutex_lock(mutex);
while(!work)
pthread_cond_wait(cond, mutex); // wait for work...
pthread_mutex_unlock(mutex);
work();
pthread_barrier_wait(barrier); /*all threads must finish their work*/
if(thread_id == 0) {
work = NULL;
pthread_cond_signal(cond); /*tell the main thread that the work is done*/
}
pthread_barrier_wait(barrier); /* make sure that none of the other worker
threads is already waiting on condition again...*/
}
В основном потоке (функция, которая назначает задачу рабочим потокам):
pthread_mutex_lock(mutex);
work = func;
pthread_cond_broadcast(cond); // tell the worker threads to start...
while(work)
pthread_cond_wait(cond, mutex); // ...and wait for them to finish
pthread_mutex_unlock(mutex);
Здесь я не использовал очередь, потому что одновременно может быть только одна задача, и основной поток должен ждать завершения задачи. Модель работает отлично, но с плохой производительностью. Проблема в том, что задачи будут выполняться очень часто при выполнении одной задачи довольно быстро. Поэтому потоки будут приостанавливаться и ждать очень часто. Я хотел бы уменьшить количество вызовов блокировки pthread_mutex_ (un), phread_cond_wait и pthread_barrier, но я не вижу, как это можно сделать.
Одновременно выполняется только одна задача.
Вам не нужно планировать. Вам не нужны потоки. Вы можете избавиться от блокировки.
<future>
. вызов std::async
вероятно, имеет больше смысла для вас, чем необработанные pthreads