通过队列动态地将工作分配给pthread

时间:2011-05-15 08:02:43

标签: c pthreads

好的,所以我遇到了将工作动态分配给队列中的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(每个线程获得四分之一的计算)但我不想这样做。相反,我想让工作像一个队列。关于如何做到这一点的任何想法?

1 个答案:

答案 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);
    }
}

另请参阅:POSIX Threads Programming - Mutex Variables