2261

11 分钟

#C 语言标准库函数 cnd_signal

/********************************************* * @brief 向条件变量发送一个信号 * @param cond 要发送信号的条件变量 ID * @return 是否成功 ********************************************/ int cnd_signal(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.4 The cnd_signal function (p: 276)
  • C11 standard (ISO/IEC 9899:2011):
    • 7.26.3.4 The cnd_signal function (p: 379)

创建于 2025/8/25

更新于 2025/8/25