在std::thread
对象析构前,必须明确,是等待线程完成(join)还是要与之分离(detach)。
如果等待std::thread
对象销毁之际还没决定好,那std::thread
的析构函数将会调用std::terminate()
终止整个程序。
示例代码:
#include <thread>
#include <iostream>
void do_lengthy_work()
{
std::cerr << __FUNCTION__;
};
int main(void)
{
{
std::thread t(do_lengthy_work);
//t.join()
//理应在这里join或detach
}
while (1)
{
}
}
这里我们既不join也不detach,那么就会导致std::terminate()
被调用,导致程序终止。
若源对象是临时变量,移动就会自动发生。
若源对象是具名变量,则必须通过调用std::move()
直接请求转移。
标准库中有一些类的归属权语义是 是只可移动但不可复制的,如std::thread
、std::unique_ptr
。
class X{
public:
void do_lengthy_work();
};
X my_x;
std::thread t(&X::do_lengthy_work, &my_x);
若要将某个类的成员函数设定为线程函数,应传入一个函数指针,指向该成员函数。
此外,还要给出合适的对象指针,作为该函数的第一个参数。