You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

线程在std::counting_semaphore中先调用release()再调用acquire()会怎样?

关于std::counting_semaphore先调用release()再acquire()的行为

核心运行表现

  • 先调用release()会直接增加信号量的内部计数(只要不超过该信号量声明时指定的最大上限max())。
  • 紧接着调用acquire()时,由于计数已经大于0,会直接将计数减1并立即返回,不会触发线程阻塞。

编译期情况

这种调用顺序完全符合C++标准对std::counting_semaphore的使用规范,编译器不会抛出错误或触发相关警告(除非存在其他违反语法/规则的代码,但该调用顺序本身无问题)。

示例代码

#include <semaphore>

int main() {
    std::counting_semaphore<3> sem(0); // 初始计数设为0

    sem.release(); // 计数变为1
    sem.acquire(); // 计数变回0,无阻塞,直接执行

    return 0;
}

这段代码可正常编译并运行,无任何异常。

内容的提问来源于stack exchange,提问作者Amruta Dhanawade

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 04:33:13