cnd_wait
来自cppreference.com
在标头 <threads.h> 定义
|
||
(C11 起) | ||
原子地解锁 mutex
所指向的互斥,并在 cond
所指向的条件变量上阻塞,直至线程被 cnd_signal 或 cnd_broadcast 发信号,或直至虚假唤醒出现。在此函数返回前,重新锁定该互斥。
若调用方线程未锁定该互斥,则行为未定义。
参数
cond | - | 指向要在上面阻塞的条件变量的指针 |
mutex | - | 指向要在阻塞期解锁的互斥的指针 |
返回值
若成功则为 thrd_success ,否则为 thrd_error 。
示例
利用 cnd_wait 函数阻塞 main 线程
运行此代码
#include <stdio.h> #include <stdlib.h> #include <assert.h> #include <threads.h> mtx_t mwait; cnd_t cwait; thrd_t th; int thread_deal_fn(void *arg) { printf("thread_deal_fn 睡眠 10s\n"); thrd_sleep(&(struct timespec){.tv_sec = 10}, NULL); printf("thread_deal_fn 唤醒 main 线程\n"); cnd_broadcast(&cwait); } int main(){ // 初始化 assert(("mwait 初始化失败", mtx_init(&mwait, mtx_plain) == thrd_success)); assert(("cwait 初始化失败", cnd_init(&cwait) == thrd_success)); assert(("线程 thread_deal_fn 创建失败", thrd_create(&th, thread_deal_fn, NULL) == thrd_success)); printf("main 线程阻塞\n"); cnd_wait(&cwait, &mwait); printf("main 线程被唤醒,准备退出\n"); return 0; } /* gcc 在某些平台上默认程序为单线程,可能需要手动添加 -pthread 选项开启多线程和链接 posix thread 库 */
输出:
main 线程阻塞 thread_deal_fn 睡眠 10s thread_deal_fn 唤醒 main 线程 main 线程被唤醒,准备退出
引用
- C17 标准(ISO/IEC 9899:2018):
- 7.26.3.6 The cnd_wait function (第 277 页)
- C11 标准(ISO/IEC 9899:2011):
- 7.26.3.6 The cnd_wait function (第 380 页)
参阅
(C11) |
在条件变量上阻塞一段时长 (函数) |