2011-05-15 48 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