C++11/14 线程的创建与分离的实现
线程的创建
让我们看看示例代码(t1.cpp).
#include <iostream> #include <thread> void thread_function() { std::cout << "thread function\n"; } int main() { std::thread t(&thread_function); // 线程 t 开始运行 std::cout << "main thread\n"; t.join(); // 主线程等待子线程结束 return 0; }
代码在linux系统下将输出:
$ g++ t1.cpp -o t1 -std=c++11 -pthread $ ./t2 thread function main thread
我们要做的第一件事是创建一个线程对象(工作线程),并给它一个函数形式的任务进行工作。
主线程希望等待线程成功完成。
所以,我们使用join(). 如果最初的主线程不等待新线程执行完成,那么它会继续执行main()函数之后的代码,可能在新线程执行完毕前结束程序。
当主线程在等待时,主线程处于空闲状态。
实际上,操作系统可能会把CPU资源从主线程上移走。
请注意,我们在线程的函数和类的声明中有一个新的标准C++库头文件#include <thread>
。
下图是流程的流程图
然而,在实际执行中,事情并不是那么理想,更可能是不对称的。也许,它看起来更像下面这张图片。
当工作线程开始构造std::thread t的时候,可能会有创建时的开销(通过使用线程池可以减少此开销),图中虚线表示可能的阻塞状态。
线程的分离
我们可以创建一个新线程使其运行为自由的守护进程。
// t2.cpp int main() { std::thread t(&thread;_function); std::cout << "main thread\n"; // t.join(); t.detach(); return 0; }
分离的子线程现在是自由的,并自行运行。它变成了一个守护进程。
$ g++ t2.cpp -o t2 -std=c++11 -pthread $ ./t2 main thread
注意,分离线程没有改变打印输出到标准输出stdout,因为主线程已经结束并退出。
这是多线程编程的特点之一:我们不能确定哪个线程首先运行 (不确定性,除非我们使用同步机制。). 在我们的例子中,由于创建一个新线程需要一定的时间,主线程最有可能比子线程率先执行完毕。
还有一点我们需要注意的是,即使在这个简单的代码中,我们也在共享一个公共资源:std::cout。
因此,为了使代码正常工作,主线程应该允许我们的子线程访问资源。
一旦一个线程分离,我们不能强迫它与主线程重新连接。因此,下面的代码行是错误的,程序会崩溃。
int main() { std::thread t(&thread;_function); std::cout << "main thread\n"; // t.join(); t.detach(); t.join(); // Error return 0; }
一旦脱离,线程就应该永远是脱离状态.
我们可以使用joinable()把代码做崩溃前的检查。
因为它joinable()返回为false,join()函数不会被调用,程序运行不会崩溃。
int main() { std::thread t(&thread;_function); std::cout << "main thread\n"; // t.join(); if(t.joinable()) t.join(); return 0; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
上一篇:C语言实现餐饮点餐管理系统
栏 目:C语言
本文标题:C++11/14 线程的创建与分离的实现
本文地址:https://www.xiuzhanwang.com/a1/Cyuyan/486.html
您可能感兴趣的文章
- 04-02c语言的正则匹配函数 c语言正则表达式函数库
- 04-02c语言中对数函数的表达式 c语言中对数怎么表达
- 04-02C语言中怎么打出三角函数 c语言中怎么打出三角函数的值
- 01-10c语言求1+2+...+n的解决方法
- 01-10求子数组最大和的解决方法详解
- 01-10深入理解约瑟夫环的数学优化方法
- 01-10深入二叉树两个结点的最低共同父结点的详解
- 01-10数据结构课程设计- 解析最少换车次数的问题详解
- 01-10c语言 跳台阶问题的解决方法
- 01-10如何判断一个数是否为2的幂次方?若是,并判断出来是多少次方
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 01-11ajax实现页面的局部加载
- 04-02jquery与jsp,用jquery
- 01-10C#中split用法实例总结
- 01-10SublimeText编译C开发环境设置
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 01-10delphi制作wav文件的方法
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文