pthread_cond_broadcast和pthread_cond_wait使用

1. pthread_cond_broadcast 是一个函数,用于向所有等待在特定条件变量上的线程发送信号,以唤醒它们。它是POSIX线程库中的一部分,用于线程间的同步。

当某个线程调用`pthread_cond_broadcast`函数时,它会通知所有等待在该条件变量上的线程,使它们从等待状态转换为可运行状态。这些线程可以继续执行它们的任务。pthread_cond_broadcast`函数的原型如下:
 

#include <pthread.h>

int pthread_cond_broadcast(pthread_cond_t *cond);

其中,`cond`是一个指向条件变量的指针。调用`pthread_cond_broadcast`函数时,需要确保已经对条件变量进行了正确的初始化。

2. 需要注意的是,`pthread_cond_broadcast`函数并不会阻塞调用它的线程,它只是发送信号给等待在条件变量上的线程。因此,当调用pthread_cond_broadcast函数时,它会唤醒所有等待在条件变量上的线程,但并不保证它们会立即执行。线程的执行顺序和调度是由操作系统决定的。

通常情况下,pthread_cond_broadcast函数与pthread_cond_wait函数一起使用,用于实现线程间的同步。当某个线程调用pthread_cond_wait函数时,它会进入等待状态,并释放对应的互斥锁。当其他线程调用pthread_cond_broadcast函数时,等待在条件变量上的线程会被唤醒,并尝试重新获取互斥锁,从而继续执行。

下面是一个简单的示例代码,演示了pthread_cond_broadcast函数的使用:

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>

pthread_mutex_t mutex;
pthread_cond_t cond;
int count = 0;


void* thread_func(void* arg) {
    int is_wait = 0;
    pthread_mutex_lock(&mutex);
    count++;

    if (count == 5) {
        //printf("[%d]本线程不等待,条件满足唤醒其他线程,然后直接返回\n", count);
        pthread_cond_broadcast(&cond);
    } else {
        is_wait = 1;
        printf("本线程条件不满足,即将进入线程等待\n");
        pthread_cond_wait(&cond, &mutex);
    }

    if (is_wait) {
        printf("本线程曾经等待过,现在被唤醒了,继续执行\n");
    } else {
        printf("本线程不等待,条件满足唤醒了其他线程后,直接返回\n");
    }

    pthread_mutex_unlock(&mutex);
    // 线程继续执行其他操作
    return NULL;
}

int main() {
    pthread_t threads[5];
    pthread_mutex_init(&mutex, NULL);
    pthread_cond_init(&cond, NULL);

    for (int i = 0; i < 5; i++) {
        pthread_create(&threads[i], NULL, thread_func, NULL);
    }

    //sleep(5);
    // 等待所有线程结束
    for (int i = 0; i < 5; i++) {
        pthread_join(threads[i], NULL);
    }

    pthread_mutex_destroy(&mutex);
    pthread_cond_destroy(&cond);

    return 0;
}

在上面的示例中,我们创建了5个线程,并且每个线程都会递增count变量的值。当count的值达到5时,其中一个线程会调用pthread_cond_broadcast函数,通知其他等待在条件变量上的线程。并把他们唤醒继续执行,上面的例子将打印:

[1]本线程条件不满足,即将进入线程等待
[2]本线程条件不满足,即将进入线程等待
[3]本线程条件不满足,即将进入线程等待
[4]本线程条件不满足,即将进入线程等待
本线程不等待,条件满足直接返回
本线程曾经等待过,现在被唤醒了,继续执行
本线程曾经等待过,现在被唤醒了,继续执行
本线程曾经等待过,现在被唤醒了,继续执行
本线程曾经等待过,现在被唤醒了,继续执行

需要注意的是,线程在进入pthread_cond_wait的时候,会自动释放互斥锁,请知!

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
pthread_cond_broadcast和pthread_cond_wait也是用于线程间同步的函数,类似于pthread_cond_signal和pthread_cond_wait的组合,但有一些区别。 pthread_cond_broadcast用于广播条件变量的信号。当一个线程调用pthread_cond_broadcast时,它会唤醒所有正在等待这个条件变量的线程。这与pthread_cond_signal的区别在于,pthread_cond_signal只会唤醒一个等待线程,而pthread_cond_broadcast会唤醒所有等待线程。 pthread_cond_wait用于等待条件变量的信号,与pthread_cond_signal和pthread_cond_broadcast一起使用。当一个线程调用pthread_cond_wait时,它会阻塞等待条件变量的信号。当收到信号后,线程会重新激活,并且会重新检查条件是否满足。如果条件不满足,线程可能会再次进入等待状态。 以下是一个使用pthread_cond_broadcast和pthread_cond_wait的示例代码: ```c pthread_mutex_t mutex; pthread_cond_t cond; int condition = 0; void* thread1(void* arg) { pthread_mutex_lock(&mutex); while (condition == 0) { pthread_cond_wait(&cond, &mutex); } // 条件满足后执行的代码 pthread_mutex_unlock(&mutex); return NULL; } void* thread2(void* arg) { pthread_mutex_lock(&mutex); condition = 1; pthread_cond_broadcast(&cond); pthread_mutex_unlock(&mutex); return NULL; } int main() { pthread_t tid1, tid2; pthread_mutex_init(&mutex, NULL); pthread_cond_init(&cond, NULL); pthread_create(&tid1, NULL, thread1, NULL); pthread_create(&tid2, NULL, thread2, NULL); pthread_join(tid1, NULL); pthread_join(tid2, NULL); pthread_mutex_destroy(&mutex); pthread_cond_destroy(&cond); return 0; } ``` 在上述示例中,thread1线程调用pthread_cond_wait等待条件满足,而thread2线程在某个时刻将条件设置为满足,并调用pthread_cond_broadcast发送信号。这样,所有等待的线程都会被唤醒并执行相应的代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值