C++11并发学习之一:小试牛刀

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.运行结果

从打印信息可以看出,有两个线程在运行。

原文链接:C++11并发学习之一:小试牛刀_草上爬的博客-CSDN博客

© 版权声明
THE END
喜欢就支持一下吧
点赞529 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容