2014-01-06 4 views
0

В моем приложении есть основной поток, который назначает задачи нескольким рабочим потокам. Модели связи заключается в следующем:Увеличение производительности пула потоков (C++, pthreads)

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

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

Можете ли вы объяснить, какая задача разделяется? возможно, сама задача не улучшится от ее запуска через несколько потоков. – nrathaus

+3

Возможно, вы можете выполнять свои задачи и запускать их группами, а не по одному за раз? – benjymous

+0

Я разрабатываю небольшую библиотеку для вычисления линейной алгебры. Задачами, которые могут быть разделены, являются векторные операции, такие как сложение, вычитание, точечные продукты и т. Д. Я должен запускать одну задачу за раз, потому что я не знаю, какие операции будет выполнять пользователь библиотеки, но производительность этих операций значительно возрастает, Я использую потоки. Изменить: производительность вышеприведенного кода не очень плоха, но не так хороша, как использование OpenMP, например (я хочу сравнить оба метода). – cthl

ответ

0

Задача только по одной задаче.

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

+0

Мне нужны темы. Сама одна задача распределяется по нескольким потокам, и это выгодно. Пожалуйста, см. Мой комментарий выше. – cthl

+0

@cthl затем используйте [''] (http://en.cppreference.com/w/cpp/header/future). вызов ['std :: async'] (http://en.cppreference.com/w/cpp/thread/async), вероятно, имеет для вас больше смысла, чем исходные pthreads – Mgetz

Смежные вопросы