1.与C++11多线程相关的头文件
C++11 新标准中引入了四个头文件来支持多线程编程,他们分别是<atomic> ,<thread>,<mutex>,<condition_variable>和<future>。
<atomic>:
该头文主要声明了两个类, std::atomic和std::atomic_flag,另外还声明了一套C风格的原子类型和与C兼容的原子操作的函数。
<thread>:
该头文件主要声明了 std::thread 类,另外 std::this_thread 命名空间也在该头文件中。
<mutex>:
该头文件主要声明了与互斥量(mutex)相关的类,包括std::mutex系列类, std::lock_guard,std::unique_lock,以及其他的类型和函数。
<condition_variable>:
该头文件主要声明了与条件变量相关的类,包括 std::condition_variable和std::condition_variable_any。
<future>:
该头文件主要声明了std::promise, std::package_task两个Provider类,以及std::future和std::shared_future两个Future类,另外还有一些与之相关的类型和函数,std::async()函数就声明在此头文件中。
2.Hello world
#include <thread>
#include <iostream>
void func()
{
std::cout<<"worker thread ID:"<<std::this_thread::get_id()<<std::endl;
std::cout<<"Hello Word"<<std::endl;
}
int main()
{
std::cout<<"main thread ID:"<<std::this_thread::get_id()<<std::endl;
std::thread workerThread(func);
workerThread.join();
return 0;
}
通过thread类直接申明一个线程workerThread,参数是这个线程执行的回调函数的地址,通过jion()方法阻塞主线程,直到workerThread线程执行结束为止。
在构造了一个新的线程对象之后,如果既不调用detach方法,也不用调用join方法,会发生什么事情?
要解释清楚detach的作用,首先要厘清joinable和nonjoinable状态的区别。c++的std::thread类型有一个std::thread::joinable()方法,该方法可以判断一个std::thread对象的状态是否为joinable。
当调用detach或join方法时,thread对象的状态将由joinable转为non-joinable,也就是std::thread::joinable()的返回值会由true变为false
在thread对象析构时,会判断joinable状态,如果当前对象是joinable的,就会调用std::terminate(),结束进程。源码如下:
~thread()
{
if (joinable())
std::terminate();
}
据此,我们可以得出问题的结论,如果c++线程对象既不调用detach又不调用join,那么在thread对象析构时,会异常结束进程。
3.运行结果
从打印信息可以看出,有两个线程在运行。
暂无评论内容