好的,所以我遇到了将工作动态分配给队列中的pthread的问题。
例如,在我的代码中,我有一个如下所示的结构:
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的值。每个struct calc对num。
都有不同的值我想生成4个pthreads,这很容易,但我想在开始时这样做,
线程0得到calcArray [0]
线程1得到calcArray [1]
线程2得到calcArray [2]
线程3得到calcArray [3]
现在假设每个线程需要不同的时间来进行每个计算的计算,
如果第一个线程完成,它将获得calcArray [4]
然后线程3完成并获得calcArray [5]来做
并且这一直持续到达calcArray [l]的结尾。
我知道我可以将数组拆分为l / 4(每个线程获得四分之一的计算)但我不想这样做。相反,我想让工作像一个队列。关于如何做到这一点的任何想法?
答案 0 :(得分: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);
}
}