我有一系列结构。每个结构如下。
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]
答案 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
线程函数的当前线程特定条目。