我的應用程序有一個主線程,它將任務分配給多個工作線程。通信模式如下:提高線程池(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的調用次數,但我不明白這是如何完成的。
你能解釋一下共享什麼任務嗎?也許這個任務本身不能通過多線程運行來提高 – nrathaus
也許會批量完成你的任務,並且按組來運行它們,而不是一次一個地運行它們。 – benjymous
我爲線性代數計算開發了一個小庫。共享的任務是向量操作,如加法,減法,點積等。我必須一次運行一個任務,因爲我不知道庫的用戶將執行什麼操作,但是這些操作的性能會顯着增加我使用線程。編輯:上面的代碼的性能並不是很差,但不如使用OpenMP的例子(我想比較兩種技術)。 – cthl