2016-12-29 38 views
2

我有一個C程序,它將任意數量的文件作爲命令行參數,併爲每個文件計算sha1sum。我正在使用pthreads,所以我可以利用所有4個核心。c pthreads:在任何時候同時運行最多4個線程

目前,我的代碼同時並行運行所有線程。 這裏是一個片段:

c = 0; 
for (n = optind; n < argc; n++) { 
    if (pthread_create(&t[c], NULL, &sha1sum, (void *) argv[n])) { 
     fprintf(stderr, "Error creating thread\n"); 
     return 1; 
    } 
    c++; 
} 

c = 0; 
for (n = optind; n < argc; n++) { 
    pthread_join(t[c], NULL); 
    c++; 
} 

顯然,它是有效的(或可擴展),同時啓動所有線程。

什麼是最好的方法來確保,只有4個線程在任何時間運行?不知何故,我需要在開始時啓動4個線程,然後在完成後用新的線程「替換」線程。

我該怎麼做?

回答

2

顯然,一次啓動所有線程效率不高(或可伸縮)。

創建4個線程並不一定能在4核心機器上提供最佳性能。如果線程正在執行IO或等待某些事情,那麼創建4個以上的線程也可能導致更好的性能/效率。你只需要根據你的線程所做的工作來找出一個近似數字,並且可能是一個小基準。

無論您選擇哪個數字(即線程數),您正在尋找的是thread pool。這個想法是創建一個固定數量的線程,並在完成後立即提供它們。

請參閱C: What's the way to make a poolthread with pthreads?瞭解簡單骨架。 repo也顯示了一個獨立的示例(如果要使用它,請檢查許可證)。你可以在網上找到許多類似的例子。

0

您正在尋找的東西是semaphore;它將允許您一次只限制4個線程運行。你可以/最先啓動它們,當運行一個完成時,它會照顧一個新的進程。