即发即弃 std::线程对象清理自身
Fire-and-forget std::thread objects cleaning themselves up
在实现服务等时,可能需要即发即弃功能,即创建线程并将其留给自己的设备。但是,需要将std::thread
对象保留在某个地方以防止它超出范围,但是当线程完成时,没有整洁的delete this
支持,即使有,对于非指针分配来说,这也将是一个问题。同样,更高级别的库可能具有Timer
对象,其中一次性计时器可能会触发,但完成后需要清理。
人们也许可以保留std::thread
和Timer
对象的集合,并且每隔一段时间就会浏览列表并删除完成的对象,但这似乎很麻烦。有没有一些有用的成语来管理这些类型的临时人员?
我的直接解决方案是结合使用std::mutex
和std::atomic
来让我的服务返回BUSY
所以我只有一个线程,但这感觉就像代码气味
这就是 std::thread::d etach(( 的用途——如果你想让线程"即发即忘",那么在创建它之后调用它detach
。 这会导致 std:thread 对象不再引用实际的执行线程,因此您可以销毁 std::thread,并且对执行没有影响。
如果有很多即发即弃功能,您可以考虑使用Thread Pool
.创建和销毁线程有开销,其中很多可能会占用 RT 中的 RAM。 线程池为您启动 X 个线程为您服务,它将为您管理每个"即发即弃"线程。
一个简单的线程池,为我解决问题。
std::mutex
与管理线程的资源无关,它与同步线程有关。
相关文章:
- 为什么std::async使用同一个线程运行函数
- 在std::thread中,joinable()然后join()线程安全吗
- 在main()之外初始化std::vector会导致性能下降(多线程)
- MESI协议和std::atomic-它是否确保所有写入立即对其他线程可见?
- 使用 std::string () const 函数启动线程或未来
- 用C++中的std::condition_variable将线程置于死锁中会有风险吗
- 即发即弃 std::线程对象清理自身
- std::mutex 如何防止线程修改?
- std::线程导致程序中止
- 如果在 2 个线程中使用,是否值得将size_t声明为 std::atomic?
- std::cout 来自多个线程
- 简单使用 std::atomic 在两个线程之间共享数据
- std::线程不是全局变量,但在到达创建它的函数的末尾时不会超出范围?
- 线程 std::调用未知类型,无法专门化函数错误
- 使用 std::chrono::steady_clock 对线程/异步中的代码进行基准测试
- 带有 std::cout 的多线程控制台文本动画
- 线程不是 std c++ 的成员
- ZeroMQ 在使用 std::thread 创建工作线程时崩溃
- 使用 std::condition_variable 触发其他线程.使用哪些互斥锁?
- 使用多线程(std::async、std::thread或?)加速