启动线程
void do_some_work();
std::thread my_thread(do_some_work);
#include<iostream>
#include<thread>
void hello(){
std::cout<<"Hello Concurrent World\n";
}
int main(){
std::thread t(hello);
t.join();
}
在一些情况下,线程运行时,任务中的函数对象需要通过某种通讯机制进行参数的传递,或者执行一系列独立操作;可以通过通讯机制传递信号,让线程停止。
启动了线程,需要明确是要等待线程结束(使用join()),还是让其自主运行。如果 std::thread 对象销毁之前还没有做出决定,程序就会终止( std::thread 的析构函数会调用 std::terminate() )。
创建线程注意点一:
std::thread my_thread(background_task());
这是在声明一个函数而不是在创建一个线程。
这声明了一个名为my_thread的函数,这个函数带有一个参数(函数指针指向没有参数并返回 background_task对象的函数),返回一个 std::thread 对象的函数,而非启动了一个线程。
如果想要启动一个线程,可以这样写:
外面套层小括号
std::thread my_thread((background_task()));
std::thread my_thread{background_task()};
std::thread my_thread([](){
background_task();
});
创建线程注意点二:如果传入参数的对象中包含的指针和引用需要谨慎,用一个能访问局部变量的函数去创建线程是危险的(除非十分确定线程会在函数完成前结束)。
线程等待
在C++的std::thread
中,join()
函数用于等待线程的完成,并清理与线程相关的资源。一旦调用了join()
,std::thread
对象就不再与已经完成的线程有关联。这是因为一旦线程完成执行,它的资源(如线程栈等)就不再需要,而join()
就是用来等待线程完成并释放这些资源的。
对于每个std::thread
对象,只能调用一次join()
。如果再次调用join()
,就会导致运行时错误。
如果需要等待多个线程完成,可以创建一个线程数组或使用其他适当的数据结构,然后对每个线程调用join()
。