c - 如何使用 pthread_cond_signal 和 pthread_cond_wait 使 pthreads 工作正常?

标签 c pthreads

尝试实现两个并行工作器。形成数据后,我需要告诉工作人员获取数据并进行处理。这是代码:

#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/

相关文章:

c - 调用 srand() 时遇到读取变量错误(无法访问地址处的内存)

c++ - 无法为 Netbeans 启用 pthread

c - pthread_create 未定变量

c - 传递两个参数

c - 有没有更好的方法来做 c 命名参数?

c - 为结构内的结构数组分配内存

c - 为什么在c中使用函数返回指针及函数返回指针的应用

c - 在字符串中查找子字符串的所有实例

c - pthreads - pthread_cond_wait 上的死锁

统计Linux内核线程在CPU上执行的次数