2011-07-12 43 views
0

所以我有一個程序,用數字做這些計算。該程序是線程化的,並且線程的數量是從用戶指定的。如何使程序以這種方式工作?

我會給出一個接近例如

static void *program_thread(void *thread) 
{ 

    bool somevar = true; 

    if(somevar) 
    { 
     work = getwork(); 
    } 

    dowork(work); 

    if(condition1 blah blah) 
     somevar = false; /* disable getwork */ 

    if(condition2) 
     somevar = true; /* condition was either met or not met, so we request 
new work either way */ 

} 
與並行線程

然後(我會跳過一些代碼)我做

int main(blah) 
{ 
    if (pthread_create(&thr->pth, NULL, program_thread, thread_number)) { 
     printf("%s","program thread create failed"); 
     return 1; 
    } 
} 

現在我將開始解釋。創建的線程數是從用戶指定的,所以我做一個for循環,並創建儘可能多的線程,因爲我需要。 每個線程調用

work = getwork(); 

因此獲得獨立的工作要做,但是CPU是這種工作緩慢。它嘗試通過嘗試2^32數字(它是從1到4 294 967 296)

來計算某事但我的CPU每秒只能做大約300萬個數字,到它達到40億個數字時,重新啓動(對於新工作)。

所以我想到了一個更好的方法。而不是每個線程得到完全不同的工作,所有的線程應該得到相同的工作拆分他們需要嘗試的數字。

的問題是,我不能CONTROLL什麼工作,它得到的,所以我必須取

work = getwork(); 

啓動線程之前。問題是如何?顯然使用pthread_create ...但那又如何?

+0

它不是密集型的,它是連接的。它需要通過嘗試每個數字從1到40億開始計算。但效率低下,因爲速度很慢,而且跟不上。所以每個線程必須將這40億個數字分成兩個。所以如果我啓動兩個線程,那麼Thread1的工作範圍從1到2,147,483,648,線程2的範圍從2,147,483,649到4,294,967,296 – dikidera

+0

正如你所說的,首先調用getwork,如果不是在主線程上慢放,那麼根據用戶選擇的線程數量均勻地分配工作。 – Joe

+0

然後調用兩個pthread_creates?但是,我將如何重新啓動它們?我指的是新工作。 – dikidera

回答

0

你拿去做它不止一種方法:

  • 分割你的工作包成更小的部分(因此,您getWork返回一個新的,較小的工作)
  • 工作專賣店在一個共同的地方,您在使用從pthread API一個reader-writer pattern
  • 從你的線程訪問,第4個參數是給你的線程,你可以做一些類似下面的代碼:

    Work = getWork(); 
    if (pthread_create(&thr->pth, NULL, program_thread, (void*) &work)) 
         ... 
    

    和你program_thread功能會是這樣的

    static void *program_thread(void *pxThread) 
    { 
        Work* pWork = (Work*) pxThread; 
        ... 
    

    當然,你需要檢查指針和共同的東西的validaty(在我的例子,我創造了它在堆棧中最有可能是一個壞主意)。請注意,你的代碼是一個thread_number作爲指針,這通常是一個壞主意。如果您希望將更多信息傳輸到您的線索,只需將其隱藏到結構中即可。

我不知道我完全理解你的問題,但這可能會給你一些提示最有可能。請注意,在執行多線程時,您需要考慮具體問題,如競爭條件,併發訪問以及對象的更復雜的生命週期......

相關問題