所以我有一個程序,用數字做這些計算。該程序是線程化的,並且線程的數量是從用戶指定的。如何使程序以這種方式工作?
我會給出一個接近例如
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 ...但那又如何?
它不是密集型的,它是連接的。它需要通過嘗試每個數字從1到40億開始計算。但效率低下,因爲速度很慢,而且跟不上。所以每個線程必須將這40億個數字分成兩個。所以如果我啓動兩個線程,那麼Thread1的工作範圍從1到2,147,483,648,線程2的範圍從2,147,483,649到4,294,967,296 – dikidera
正如你所說的,首先調用getwork,如果不是在主線程上慢放,那麼根據用戶選擇的線程數量均勻地分配工作。 – Joe
然後調用兩個pthread_creates?但是,我將如何重新啓動它們?我指的是新工作。 – dikidera