线程在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
相关产品推荐
相关产品推荐

