尝试实现两个并行工作器。形成数据后,我需要告诉工作人员获取数据并进行处理。这是代码:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
void *worker(void *data);
struct worker_data_t
{
pthread_t thread_id;
pthread_mutex_t mutex;
pthread_cond_t cond;
long id, data;
};
struct worker_data_t *workers_data;
int main(int argc, char **argv)
{
int cpus = sysconf(_SC_NPROCESSORS_ONLN);
if (cpus < 1)
cpus = 1;
workers_data = (struct worker_data_t *)malloc(cpus * sizeof(struct worker_data_t));
int ret_val[cpus];
for (int i = 0; i < cpus; i++)
{
pthread_mutex_init(&workers_data[i].mutex, NULL);
pthread_cond_init(&workers_data[i].cond, NULL);
workers_data[i].id = i;
}
for (int i = 0; i < cpus; i++)
ret_val[i] = pthread_create(&workers_data[i].thread_id, NULL, worker, &workers_data[i]);
pthread_mutex_lock(&workers_data[0].mutex);
pthread_cond_signal(&workers_data[0].cond);
pthread_mutex_unlock(&workers_data[0].mutex);
pthread_mutex_lock(&workers_data[0].mutex);
pthread_cond_signal(&workers_data[0].cond);
pthread_mutex_unlock(&workers_data[0].mutex);
for (int i = 0; i < cpus; i++)
pthread_join(workers_data[i].thread_id, NULL);
return 0;
}
void *worker(void *data)
{
struct worker_data_t d = *((struct worker_data_t*)(data));
printf("Thread %d started\n", d.id);
for (;;)
{
pthread_mutex_lock(&workers_data[d.id].mutex);
pthread_cond_wait(&workers_data[d.id].cond, &workers_data[d.id].mutex);
printf("catch!\n");
pthread_mutex_unlock(&workers_data[d.id].mutex);
}
}
在通过 pthread_cond_signal 通知 worker 之后没有任何反应。如果我将 sleep(1) 放在每个 pthread_cond_signal block 之前,它就可以工作。
应该怎么做才能让它不休眠地工作?
最佳答案
正如 R. 所说,正如他本应回答的那样,您需要的是一个谓词。这是您要测试的内容,以查看条件是否为真。
在您的情况下,它应该是一个简单的变量,受 workers_data[0].mutex
保护。
然后在您的 worker 中,您锁定互斥体,就像您已经做的那样,然后检查谓词。如果谓词为真,则无需等待条件,所以不用。去做你需要做的吧。如果谓词为假,则等待条件。
不要忘记的一个非常重要的一点是,绝不能在条件变量使用的互斥锁之外更改谓词。如果是,则在某些情况下会错过条件,这会导致线程卡住。
关于c - 如何使用 pthread_cond_signal 和 pthread_cond_wait 使 pthreads 工作正常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8966112/