2014-01-06 108 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)調用對你來說可能比原始pthread更有意義 – Mgetz