GCC 11.1.0下std::barrier死锁的代码合规性及运行特性问询
问题1:该段代码的行为是否符合C++标准的明确定义?
是,这段代码完全符合C++20标准的定义,不存在未定义行为:
std::barrier的使用符合规范:构造时指定参与线程数为2,两个工作线程每次都会成对调用arrive_and_wait(),没有线程会提前退出、漏调用该方法,也没有额外线程参与屏障同步。- 没有数据竞争:
std::cout的输出操作是线程安全的,每个线程的字符串拼接是线程本地操作,不存在跨线程的数据竞态。
问题2:该代码理论上是否应当保证无死锁?
是,理论上这段代码完全不会出现死锁:
每个线程的执行流程是固定的,每个循环迭代中都会按照顺序执行两次屏障等待,每次等待都恰好有2个线程参与,不存在循环等待、持有锁等待其他锁的情况,也不存在某个线程永久停在屏障之前不到达的情况。
你遇到的本地GCC 11.1.0环境下的死锁是该版本libstdc++中std::barrier的已知实现bug,该bug在后续的GCC小版本更新中已经得到修复,和代码本身的逻辑无关。
内容的提问来源于stack exchange,提问作者Koosha
相关产品推荐
相关产品推荐

