Увеличение производительности пула потоков (C ++, pthreads)

0

В моем приложении есть основной поток, который назначает задачи нескольким рабочим потокам. Схема связи следующая:

Функция потока (работа здесь является указателем функции):

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, но я не вижу, как это можно сделать.

  • 1
    Можете ли вы объяснить, какая задача разделяется? может быть, сама задача не улучшится от ее выполнения через несколько потоков
  • 3
    Возможно, сгруппируйте свои задачи и запускайте их по группам, а не по одному за раз?
Показать ещё 3 комментария
Теги:
pthreads

1 ответ

0

Одновременно выполняется только одна задача.

Вам не нужно планировать. Вам не нужны потоки. Вы можете избавиться от блокировки.

  • 0
    Мне нужны темы. Одна задача сама распределяется по нескольким потокам и от этого выигрывает. Пожалуйста, смотрите мой комментарий выше.
  • 0
    @cthl, тогда используйте вместо него <future> . вызов std::async вероятно, имеет больше смысла для вас, чем необработанные pthreads

Ещё вопросы

Сообщество Overcoder
Наверх
Меню