好的,所以我在向队列中的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个pthread,这很容易,但是我想在一开始就做到这一点,
线程0获取calcArray [0]
线程1获取calcArray [1]
线程2获取calcArray [2]
线程3获取calcArray [3]
现在假设每个线程要花费不同的时间来计算每个计算,
如果线程1首先完成,则它将获得calcArray [4]
然后线程3完成并获取calcArray [5]
并且一直持续到到达CalcArray [l]的末尾。
我知道我可以将数组拆分为l / 4(每个线程获取四分之一的计算),但是我不想这样做。相反,我想使工作像一个队列。有关如何执行此操作的任何想法?
最佳答案
通过创建一个包含要分配的下一个元素的索引的变量,然后通过互斥体对其进行保护,可以非常轻松地完成此操作。
例:
// 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
关于c - 通过队列将工作动态分配给pthread,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6007236/