#C 语言标准库函数 cnd_broadcast
/*********************************************
* @brief 向条件变量发送一个广播
* @param cond 要发送广播的条件变量 ID
* @return 是否成功
********************************************/
int cnd_broadcast(cnd_t* cond);
说明
向条件变量 cond
发送一个广播,唤醒所有等待该条件变量的线程。
参数
cond
- 要发送广播的条件变量 ID
返回值
- 成功时返回
thrd_success
- 失败时返回
thrd_error
#示例
#include <stdio.h>
#include <threads.h>
// 线程数量
#define N 10
// 全局变量
mtx_t mutex; // 互斥量
cnd_t cond; // 条件变量
int tasks = 0; // 等待的线程数量
// 线程函数
int func(void* data)
{
mtx_lock(&mutex); // 加锁
cnd_wait(&cond, &mutex); // 等待信号
printf("线程被唤醒\n");
mtx_unlock(&mutex); // 解锁
}
int main(void)
{
mtx_init(&mutex, mtx_plain); // 创建互斥量
cnd_init(&cond); // 创建条件变量
// 创建多个线程
thrd_t threads[N];
for (int i = 0; i < N; i += 1)
{
thrd_create(&threads[i], func, NULL);
}
// 等待 1 秒,确保线程都开始运行并等待条件变量
thrd_sleep(&(struct timespec){.tv_sec = 1, .tv_nsec = 0}, NULL);
printf("发送单个信号\n");
cnd_signal(&cond);
// 等待 1 秒
thrd_sleep(&(struct timespec){.tv_sec = 1, .tv_nsec = 0}, NULL);
printf("发送广播信号\n");
cnd_broadcast(&cond);
for (int i = 0; i < N; i += 1)
{
thrd_join(threads[i], NULL);
}
// 清除互斥量和条件变量
mtx_destroy(&mutex);
cnd_destroy(&cond);
return 0;
}
运行结果:
发送单个信号 线程被唤醒 发送广播信号 线程被唤醒 线程被唤醒 线程被唤醒 线程被唤醒 线程被唤醒 线程被唤醒 线程被唤醒 线程被唤醒 线程被唤醒
说明:
示例中创建了 10 个线程,等待条件变量的信号。通过 cnd_signal
发送信号时只唤醒一个线程;通过 cnd_broadcast 发送信号时唤醒全部线程。
#推荐阅读
#参考标准
- C17 standard (ISO/IEC 9899:2018):
- 7.26.3.1 The cnd_broadcast function (p: 275-276)
- C11 standard (ISO/IEC 9899:2011):
- 7.26.3.1 The cnd_broadcast function (p: 378)