C++ C++;11:如何在std::线程的执行函数退出时加入它?
我有以下类,它的一个成员字段是std::thread:C++ C++;11:如何在std::线程的执行函数退出时加入它?,c++,multithreading,c++11,C++,Multithreading,C++11,我有以下类,它的一个成员字段是std::thread: class MyClass { private: std::thread auxThread; void run(); public: ~MyClass(); void start(); } MyClass:~MyClass() { if (auxThread.joinable()) auxThread.join(); } void MyClass::run() { //d
class MyClass {
private:
std::thread auxThread;
void run();
public:
~MyClass();
void start();
}
MyClass:~MyClass() {
if (auxThread.joinable())
auxThread.join();
}
void MyClass::run() {
//do stuff
}
void MyClass::start() {
auxThread = std::thread (&MyClass::run, this); //Move assignment
}
我可以按需启动auxThread,这要感谢使用空构造函数初始化它,然后将其分配给与实际执行线程关联的std::thread对象(通过start()函数),但为了最小化系统资源使用,我希望在run()之后立即将()auxThread与主线程连接已退出,即当auxThread的工作完成而不是在MyClass析构函数中完成时。它看起来可以用来唤醒一个睡眠中的主线程并完成这项任务,但我不想阻止主线程,除非(希望)使用join()短暂地阻止它
两个问题:
join
所做的唯一一件事就是阻塞,直到正在执行的函数完成为止。在run
完成执行后再次调用join
是不必要的,基本上是禁止操作的
此外,来自线程的“资源”也是最小的。我不希望只为像您这样的单个线程分配大量内存。RAM现在非常便宜,所以你不必担心这一点,因为你没有并行执行5M个线程,这在传统计算机上是毫无意义的。1)不,这不会消耗资源,2)不
join()
但你可以detach()
如果你真的不关心线程,请不要过早地优化它。请注意,你想调用join()
的主要原因不是为了释放资源,而是为了在修改进程/环境之前保证线程已经死了,并且已经消失,而这种方式可能会导致线程调用未定义的行为。尤其要在程序退出之前join()
所有线程,因为在main()
返回后执行的运行时清理代码可能会清理运行中线程可能认为仍然存在的数据结构,当main()
返回时,如果任何线程仍在运行,则在关机时会导致偶尔的崩溃。