国际访客建议访问 Primers 编程伙伴 国际版站点 > C 教程 > cnd_broadcast 以获得更好的体验。

# C 语言标准库函数 cnd_broadcast

在头文件 threads.h 中定义。
/*********************************************
 * @brief 向条件变量发送一个广播
 * @param cond 要发送广播的条件变量 ID
 * @return 是否成功
 ********************************************/
int cnd_broadcast(cnd_t* cond);

!subtitle:说明

向条件变量 cond 发送一个广播,唤醒所有等待该条件变量的线程。

!subtitle:参数

  • cond - 要发送广播的条件变量 ID

!subtitle:返回值

  • 成功时返回 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;
}

!subtitle:运行结果

发送单个信号
线程被唤醒
发送广播信号
线程被唤醒
线程被唤醒
线程被唤醒
线程被唤醒
线程被唤醒
线程被唤醒
线程被唤醒
线程被唤醒
线程被唤醒

!subtitle:说明

示例中创建了 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)

本文 更新于: 2025-11-27 09:38:07 创建于: 2025-11-27 09:38:07