2011-07-11 50 views
0

我對pthread世界非常陌生。 我需要處理與命令的列表中的文件,讓說,文件看起來像這個 -pthreads中並行磁貼執行的限制數

Command1 
Command2 
Command3 
. 
. 
CommandN 

對於每一個命令,我想創建一個線程。現在的問題是,如果有大量的命令,我將最終創建大量的線程,這是我想要避免的。所以,我想限制在任何給定時間點執行的線程數量。假設這個數字是5.

有人可以建議如何實現這個嗎?我使用以下code爲learning-

#include <pthread.h> 
#include <stdio.h> 
#include <stdlib.h> 
#define NUM_THREADS 4 

void *BusyWork(void *t) 
{ 
    int i; 
    long tid; 
    double result=0.0; 
    tid = (long)t; 
    printf("Thread %ld starting...\n",tid); 
    for (i=0; i<1000000; i++) 
    { 
     result = result + sin(i) * tan(i); 
    } 
    printf("Thread %ld done. Result = %e\n",tid, result); 
    pthread_exit((void*) t); 
} 

int main (int argc, char *argv[]) 
{ 
    pthread_t thread[NUM_THREADS]; 
    pthread_attr_t attr; 
    int rc; 
    long t; 
    void *status; 

    /* Initialize and set thread detached attribute */ 
    pthread_attr_init(&attr); 
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); 

    for(t=0; t<NUM_THREADS; t++) { 
     printf("Main: creating thread %ld\n", t); 
     rc = pthread_create(&thread[t], &attr, BusyWork, (void *)t); 
     if (rc) { 
     printf("ERROR; return code from pthread_create() is %d\n", rc); 
     exit(-1); 
     } 
     } 

    /* Free attribute and wait for the other threads */ 
    pthread_attr_destroy(&attr); 
    for(t=0; t<NUM_THREADS; t++) { 
     rc = pthread_join(thread[t], &status); 
     if (rc) { 
     printf("ERROR; return code from pthread_join() is %d\n", rc); 
     exit(-1); 
     } 
     printf("Main: completed join with thread %ld having a status of %ld\n",t,(long)status); 
     } 

printf("Main: program completed. Exiting.\n"); 
pthread_exit(NULL); 
} 

有什麼好的例子在那裏的老闆/工人線程模型?

回答

3

創建一個放置新作業的隊列。創建5個線程。每個線程將選擇一個工作並處理它,然後它將選擇下一個工作。一旦隊列爲空,線程可以退出並且可以執行thread_join。你需要同步隊列(或數組)。

+0

謝謝!你能幫我理解爲什麼需要同步嗎?如果我將5個元素排隊到隊列中,然後創建5個線程,每個線程將處理分配給它的一個元素,然後對該元素進行去隊列,爲什麼會需要同步? – user837208

+0

出隊操作不是原子的。兩個線程都可以在同一時間獲取下一個會導致問題的工作。檢查pthread_mutex_t和pthread_cond_t的教程。 –

0

mainmain初始化一個初始值爲4的信號量。在BusyWork函數內部,每個線程在進入時應等待信號量,然後在退出時發送。一旦你加入了你所有的線程,破壞信號量。

編輯!忘記了link

0

看來你正在尋找的是線程池的概念。 Wikipedia Page有一些體面的鏈接到實現這一點的文章。另外,在github上搜索「線程池」應該給你一些很好的簡單實現。