好的,所以我在向队列中的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/

10-12 05:29