0

我有一个结构数组。每个结构如下。

struct thread_st
{
    pthread_t thr;

    int conn;
    pthread_mutex_t mutex;
    pthread_cond_t cond;
};

conn 指示线程是否有工作要做。如果它> = 0,它表示一个任务,如果它是-1,它表示等待。如果它读取-1,它会在继续之前使用以下循环等待广播我已经删除了一些错误处理,因此其他等将块缩小到需要

while (str->conn == -1) {
    else {
        if (pthread_cond_wait(&str->cond,&str->mutex)) {
            if (pthread_mutex_unlock(&str->mutex)) { }
            return NULL;
        }
        printf("here b3\n");
    }
}

现在,我的问题是,当 cond 变量被广播时 pthread_cond_broadcast(&thr->cond) ,其中 thr 是 thread_st 类型,所有线程都打印“here b3”语句。为了理智起见,我已经使用 The thread_st array is created here 进行了测试(再次删除了错误处理)

struct thread_st pool[TP_SIZE];
for (i = 0; i < TP_SIZE; i++) {
    pool[i].conn = -1;
    if (pthread_mutex_init(&pool[i].mutex,NULL)) { }
    if (pthread_cond_init(&pool[i].cond,NULL)) { }
    if (pthread_create(&(pool[i].thr), NULL,worker_thr_routine, pool)) { }
}

有任何想法吗?这是我第一次真正尝试使用 cond 和 mutex 变量,所以如果我很愚蠢,请告诉!

谢谢

更新 线程仅响应位于数组中第一个结构中的条件变量的广播。

更新 2 找到了。原来我是个白痴。在我调用 pthread create 的地方,我通过了整个池。我只是想通过 pool[i]

4

1 回答 1

1

您将对数组的引用传递pool给所有线程,因此(我猜,因为您的 OP 中缺少代码)每个线程都引用数组的第一个元素。

您可能想更改以下行:

if (pthread_create(&(pool[i].thr), NULL,worker_thr_routine, pool)) 

成为:

if (pthread_create(&(pool[i].thr), NULL,worker_thr_routine, pool + i)) 

将引用传递给线程函数的当前线程特定条目。pool

于 2013-02-26T07:07:36.623 回答