2011-05-15 47 views
0

好吧,所以我在動態分配工作給隊列中的pthreads時遇到了問題。通過隊列動態分配工作到pthreads

例如,在我的代碼有一個結構象下面這樣:

struct calc 
{ 
    double num; 
    double calcVal; 
}; 

我存儲在長度l的陣列像下面的每個結構體。

struct calc **calcArray; 

/* then I initialize the calcArray to say length l and 
    fill each calc struct with a num*/ 

現在,基於num,我想找到calcVal的值。每個結構calc對於num有不同的值。

我想產卵4個並行線程這是很容易,但我想使它所以在一開始,

線程0獲得calcArray [0]
線程1獲得calcArray [1]
線程2得到calcArray [2]
線3 calcArray [3]

現在假定,將需要不同的時間針對每個線程來執行的計算爲每個計算值,

如果線程1點結束冷杉ST,它就會得到calcArray [4]

那麼線程3個完成並得到calcArray [5]做

,這樣下去,直到達到calcArray [1]的結束。

我知道我可以將數組拆分爲1/4(每個線程獲得四分之一的計算)但我不想這樣做。相反,我想讓這項工作像一個隊列。任何想法如何做到這一點?

回答

1

通過創建一個包含要分配的下一個元素的索引的變量,然後讓它通過互斥鎖保護,您可以非常容易地完成此操作。

例子:

// Index of next element to be worked on 
int next_pos; 

// Mutex that secures next_pos-access 
pthread_mutex_t next_pos_lock; 

int main() { 
    // ... 

    // Initialize the mutex before you create any threads 
    pthread_mutex_init(&next_pos_lock, NULL); 

    next_pos = NUM_THREADS; 

    // Create the threads 

    // ... 
} 

void *threadfunc(void *arg) { 
    int index = ...; 

    while (index < SIZE_OF_WORK_ARRAY) { 
     // Do your work 

     // Update your index 
     pthread_mutex_lock(&next_pos_lock); 
     index = next_pos; 
     next_pos++; 
     pthread_mutex_unlock(&next_pos_lock); 
    } 
} 

參見:POSIX Threads Programming - Mutex Variables

+0

感謝的人,我真的很感激。 :D – user730882 2011-05-15 08:19:59

+0

這個評論裏有錯別字!它說「phread」而不是「pthread」!花了很長時間才發現... – 2011-12-28 00:24:19

+0

@ user309483:糟糕,糾正了。 – 2011-12-28 00:38:23