区块链技术博客
www.b2bchain.cn

C++多线程—-thread线程

这篇文章主要介绍了C++多线程—-thread线程的讲解,通过具体代码实例进行20523 讲解,并且分析了C++多线程—-thread线程的详细步骤与相关技巧,需要的朋友可以参考下https://www.b2bchain.cn/?p=20523

本文实例讲述了2、树莓派设置连接WiFi,开启VNC等等的讲解。分享给大家供大家参考文章查询地址https://www.b2bchain.cn/7039.html。具体如下:

C++多线程—-thread线程

  • std::thread类的实现
  • 相关函数
    • join()与detach()函数
    • 获取CPU核心个数
    • 原子变量与线程安全

C++11 新标准中加入了多线程库,其头文件为#include < thread>,其中主要包括std::thread类。

std::thread类的实现

C++11中管理线程的函数和类在头文件#include< thread>,其中包括std::thread类,最简单的是函数没有参数,仅传递名创建线程:

std::thread th1(proc1);//创建了一个名为th1的线程,并且线程th1开始执行。 

实例化std::thread类对象时,如果函数为有参函数, 如"void proc2(int a,int b)",那么实例化std::thread类对象时,则需要传递更多参数,参数顺序依次为函数名、该函数的第一个参数、该函数的第二个参数,···,如"std::thread th2(proc2, a, b);":

std::thread th2(proc2, a, b);//创建了一个名为th2的线程,并且线程th2开始执行。 

实例化std::thread类对象时,如果函数需要返回参数,可以用指针实现, 如"void proc3(int a,int &b)",如下

std::thread th2(proc2, a, std::ref(b));//创建了一个名为th2的线程,并且线程th2开始执行。 

案例代码:

// 线程案例 #include <iostream>        #include <thread>         void sub_function1() {     for (int i = 0; i != 10; ++i)     {         std::cout << "thread 1 print " << i << std::endl;     } }  void sub_function2(int n) {     std::cout << "thread 2 print " << n << std::endl; }  void sub_function3(int a, int &sum) {     std::cout << "get number: " << a << std::endl;     for (int i = 0; i < a; i++) {         sum += i;     }     std::cout << "求和:" << sum << std::endl; }  int main() {     int result = 0;     int a = 30;      //创建线程     std::thread t1(sub_function1);                              // 创建无参数的线程     std::thread t2(sub_function2, 20);                          // 创建传递常参数的线程     std::thread t3(sub_function3, a, std::ref(result));         // 创建传递指针参数的线程       std::cout << "主函数运行到此处!" << std::endl;      // 子线程与主线程会和       t1.join();                //等待子线程1汇合     t2.join();                // 等待子线程1汇合     t3.join();                // 等待子线程1汇合       std::cout << "主函数求和:" << result << std::endl;     std::cout << "线程运行完毕!" << std::endl;      return 0; } 

相关函数

C++多线程----thread线程

join()与detach()函数

只要创建了线程对象,线程就开始执行, 当线程启动后,一定要在和线程相关联的std::thread对象销毁前,对线程运用join()或者detach()方法。

join()与detach()都是std::thread类的成员函数,是两种线程阻塞方法,两者的区别是是否等待子线程执行结束。

  • (1)join()函数
    th1.join()表示等待th1线程与主线程和并,即主线程运行到该线程时,会等待th1子线程运行完毕,再运行,该函数起到阻塞作用。
    代码示例:
// 线程案例 #include <iostream>        #include <thread>         void sub_function1() {     for (int i = 0; i != 10; ++i)     {         std::cout << "子线程运行: " << i << std::endl;     } }  int main() {     std::cout << "主函数开始运行!" << std::endl;     //创建线程     std::thread t1(sub_function1);      //主线程与子线程并行     std::cout << "主线程运行到此!" << std::endl;         // 子线程与主线程汇合       t1.join();                //等待子线程1汇合       std::cout << "主线程结束!" << std::endl;      return 0; } 

运行结果:

主函数开始运行! 主线程运行到此! 子线程运行: 0 子线程运行: 1 子线程运行: 2 子线程运行: 3 子线程运行: 4 子线程运行: 5 子线程运行: 6 子线程运行: 7 子线程运行: 8 子线程运行: 9 主线程结束! 
  • (2)detach()函数
    th1.detach()表示th1线程与主线程分离,主线程会直接运行完毕,子线依然独立地运行。
    代码示例:
// 线程案例 #include <iostream>        #include <thread>         void sub_function1() {     for (int i = 0; i != 10; ++i)     {         std::cout << "子线程运行: " << i << std::endl;     } }  int main() {     std::cout << "主函数开始运行!" << std::endl;     //创建线程     std::thread t1(sub_function1);      //主线程与子线程并行     std::cout << "主线程运行到此!" << std::endl;         // 子线程与主线程分离       t1.detach();                      std::cout << "主线程结束!" << std::endl;      return 0; } 

运行结果:

主函数开始运行! 主线程运行到此! 主线程结束! 

线程 detach 脱离主线程的绑定,主线程挂了,子线程不报错,子线程执行完自动退出。
线程 detach以后,子线程会成为孤儿线程,线程之间将无法通信

获取CPU核心个数

调用函数即可获得

// 线程案例 #include <iostream>        #include <thread>         int main() {     auto n = std::thread::hardware_concurrency();//获取cpu核心个数       std::cout << n << std::endl;     return 0; } 

結果:

6 

原子变量与线程安全

给共享的资源加把锁,保证每个资源变量每时每刻至多被一个线程占用,

本文转自互联网,侵权联系删除C++多线程—-thread线程

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » C++多线程—-thread线程
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们