C pthread_cond_broadcast似乎是广播到所有cond变量

时间:2013-02-26 04:44:40

标签: c pthreads posix mutex

我有一系列结构。每个结构如下。

struct thread_st
{
    pthread_t thr;

    int conn;
    pthread_mutex_t mutex;
    pthread_cond_t cond;
};

conn表示线程是否有工作要做。如果是> = 0,则表示任务,如果为-1,则表示等待。 如果它读取-1,它继续使用以下循环进行广播,然后继续我已经删除了一些错误处理,因此else等将块缩小到需要什么

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”语句。为了理智,我已经测试过了 这里创建了thread_st数组(再次删除了错误处理)

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创建我通过整个池。我只是想通过游泳池[i]

1 个答案:

答案 0 :(得分:1)

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

您可能想要更改以下行:

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

是:

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

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