启动没有线程实例名称的线程
Start thread without thread instance name
有什么区别
MyClass* myClass = new MyClass;
std::thread myThread( &MyClass::MyMemberFunction, myClass );
和
std::thread( &MyClass::MyMemberFunction, myClass );
?
P.S。尝试使用第二种方法将 boost::asio::io_service 放入单独的线程中 - 不起作用。但第一个确实如此。如果将 std 更改为 boost.
,这两种方法都有效
WIndows7.MSVS 12.0.
第一个创建一个线程对象,您必须在某个时候分离或加入它。
第二个创建并销毁一个临时线程,终止程序,因为您没有分离或加入它。 Boost 允许这样做,在销毁时自动分离线程;但是这种行为会导致细微的错误,因此标准库会强制您做出明确的选择。
如果你真的想要一个"fire and forget"线程,你可以这样做
std::thread( &MyClass::MyMemberFunction, myClass ).detach();
但通常最好保留一个线程对象以便在合适的时间加入,尤其是当您打算 delete myClass
在某个时候加入时。
有什么区别
MyClass* myClass = new MyClass;
std::thread myThread( &MyClass::MyMemberFunction, myClass );
和
std::thread( &MyClass::MyMemberFunction, myClass );
?
P.S。尝试使用第二种方法将 boost::asio::io_service 放入单独的线程中 - 不起作用。但第一个确实如此。如果将 std 更改为 boost.
,这两种方法都有效WIndows7.MSVS 12.0.
第一个创建一个线程对象,您必须在某个时候分离或加入它。
第二个创建并销毁一个临时线程,终止程序,因为您没有分离或加入它。 Boost 允许这样做,在销毁时自动分离线程;但是这种行为会导致细微的错误,因此标准库会强制您做出明确的选择。
如果你真的想要一个"fire and forget"线程,你可以这样做
std::thread( &MyClass::MyMemberFunction, myClass ).detach();
但通常最好保留一个线程对象以便在合适的时间加入,尤其是当您打算 delete myClass
在某个时候加入时。