cnd_wait

来自cppreference.com
< c‎ | thread
在标头 <threads.h> 定义
int cnd_wait( cnd_t* cond, mtx_t* mutex );
(C11 起)

原子地解锁 mutex 所指向的互斥体,并在 cond 所指向的条件变量上阻塞,直至线程被 cnd_signalcnd_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 页)

参阅

在条件变量上阻塞一段时长
(函数)