是否允许对默认构造的std::jthread调用swap操作?含运行线程场景
对默认构造的std::jthread调用swap是否合法?
结论:完全合法
标准库层面的合法性依据
默认构造的std::jthread处于无关联线程状态(调用joinable()会返回false),而std::jthread::swap()的设计本身就支持交换任意两个jthread对象的内部状态——不管其中一方或双方是否关联了运行中的线程。
在你提供的示例代码中:
std::jthread current; // 默认构造,无关联线程 std::jthread play{play_stream, av[0]}; // 关联运行中的线程 current.swap(play);
执行swap后,current会接管play原本关联的运行线程,play则变为无关联状态。这一操作完全符合C++标准的规定,不存在合法性问题。
关于Crow框架中的异常行为
你遇到的异常行为并非swap操作本身的问题,更可能和Crow框架的线程管理逻辑冲突:
- Crow可能对其创建/管理的线程有特定的生命周期约束,不允许线程所有权被转移到外部对象。
swap后原线程对象play的析构行为可能触发了Crow的内部检查逻辑(比如框架期望该对象始终关联到它管理的线程)。- 线程停止源(
stop_source)的归属变化,可能和Crow的事件循环或停止机制产生冲突,导致回调执行异常。
建议的排查方向
- 查阅Crow框架的官方文档,确认是否允许转移线程对象的所有权。
- 尝试用移动语义替代swap(
current = std::move(play);),这和swap的最终效果一致,但可能更符合框架的设计预期。 - 结合GitHub Issue #765的上下文,查看是否有其他开发者遇到同类问题,以及官方给出的解决方案或说明。
内容的提问来源于stack exchange,提问作者Sir l33tname
相关产品推荐
相关产品推荐

