boost ::线程在删除可加入线程时存在什么问题
BOOST::thread what problems are there in deleting a joinable thread?
破坏可加入的线程指针会遇到什么问题?(即调用 delete thread
)升级引用有点模糊,需要更确切的答案。
这是一个特定示例:
假设一个子螺纹被卡在不可互相的系统调用上,例如
read(0)
,没有人配备键盘。因此,调用thread->interrupt()
然后是thread->try_join_for()
,将使线程可加入。该怎么办?
在参考指南中,似乎必须拆下线程或泄漏线指针。当卡住线被分离或指针泄漏时,实际上会发生什么。
背景:
在boost::thread::~thread()
参考中是以下词。作为Boost参考指南的"她出售海滨的贝壳",需要在解析之前阅读三到四次;
在其破坏者中隐式分离或加入Joarable()线程可能会导致很难调试正确性(用于分离)或仅在提出异常时遇到的错误(用于加入)错误。因此,程序员必须确保在线程仍然可加入时永远不会执行驱动器。
(从我可以看出的)缺点是(is)a(is)a(bad)构想(to)销毁(a)boost:::( thread)指针(while)加入)。谁提到了例外?孩子线?破坏者?
它取决于。最初,Boost的实现将在破坏时脱离一个无关的线程。自1.52版以来,这已被更改,以匹配C 11的std::thread
的行为:销毁一个非连接线程现在调用std::terminate
(默认情况下将崩溃程序)。旧行为将作为不弃用的功能保持可用,直到1.56,并且可以通过设置BOOST_THREAD_DONT_PROVIDE_THREAD_DESTRUCTOR_CALLS_TERMINATE_IF_JOINABLE
预处理器标志来激活。
为您的示例,该线程陷入了a阻塞呼叫中的线程,因此建议必须是:不要这样做。仅使用允许指定超时或使用异步I/O的封锁I/O调用。您需要能够发出一条线程的信号,等待I/O应该终止的I/O,否则您在关闭程序时可能会陷入僵局。
从理论上讲,您无法连接线程(即分离或泄漏boost::thread
对象)。但是,这通常会引起许多其他头痛,因为您不能保证该线程持有的资源将得到适当清理。这使得很难理解这种线程的行为。请注意,ISO-C 确实决定在此处调用terminate
是有原因的。
- 在已经存在的类中调用线程,而不是创建一个线程
- 线程:join上是否存在具有synchronized with relationship的隐式内存障碍
- 原子线程围栏:为什么在这个非原子变量上存在数据竞争?这有关系吗
- 是否存在简单的指向布尔值作为线程取消标志的现实情况,无法有效地取消线程?
- boost ::线程在删除可加入线程时存在什么问题
- 防止变量脱离范围,因此它们仍然存在另一个线程
- 当只有一个线程写入 c++ 中的布尔变量时,是否存在争用条件
- 从多线程.net应用程序调用的本机dll中的tbb存在问题
- stl或boost中是否存在用于线程间通信的线程安全结构,其行为类似于队列
- 线程ID不存在的OpenThread
- 两个线程之间是否存在任何内存泄漏(缓冲、清空)
- Boost:是否存在用于仅线程通信的进程间消息队列机制
- 如何确保始终存在给定数量的线程?(另外,这是线程的良好用法吗?
- 没有CUDA代码的线程中存在CUDA分段错误
- 在静态初始化期间,pthread线程变量何时开始存在
- 如果存在仅推送线程和仅弹出线程,那么C++std::队列安全吗
- 为什么 gui 线程不应该存在于多线程单元中?
- Boost smart_ptr非线程安全宏,它真的存在吗?
- Qt5中存在哪些同步原语,允许我在单个线程中等待信号到达
- 多线程程序,它将线程保存在vector而不是数组中