zoukankan      html  css  js  c++  java
  • C++多线程基础学习笔记(二)

    先总结延申以下前面(一)所讲的内容。

    主线程从main()函数开始执行,我们创建的线程也需要一个函数作为入口开始执行,所以第一步先初始化函数。

    整个进程是否执行完毕的标志是主线程是否执行完毕,一般情况下,如果想要保持子线程的运行状态,那么要主线程保持运行。

    本章从两方面介绍创建线程的方法:

    一、用函数创建线程:

    关键词:thread(类),join() ,detach(),joinable().

     join(),阻塞主线程,等待子线程执行完毕后,才到主线程执行。

    detach(),分离主线程,主线程和子线程各走各的,所以会出现多次运行会发现,运行结果可能不同,这时候需要考虑一个问题,主线程如果执行完了,子线程还没跑完,这就可能出现一定问题了。

    joinable(),判断是否使用了join()或者detach(),是返回false,否返回true。

    注意:join()和detach()不能同时使用,这两个函数本来就有互斥的关系。

     1 #include <iostream>
     2 #include <thread>
     3 void my_thread()
     4 {
     5     for (int i = 1; i <= 5; i++)
     6     {
     7         cout << "my_thread" << i << endl;
     8     }
     9 }
    10 int main()
    11 {
    12     thread my_threadObj(my_thread);  //创建一个子线程,并传入子线程的函数入口my_thread
    13     if (my_threadObj.joinable())     //返回true代表没有使用join()或者detch()
    14     {
    15         my_threadObj.join();       //阻塞主线程,并让主线程等待子线程执行完
    16     }
    17     else
    18     {
    19         return -1;
    20     }
    21   //my_threadObj.detach();      //分离主线程,子线程与主线程各自运行,所以每次运行结果可能不同
    22     for (int i = 1; i <=5; i++)
    23     {
    24         cout << "main_thread" << i << endl;
    25     }
    26     return 0;
    27 }

    二、其他方法创建线程

    1.用类对象

    一旦用了detach()将子线程和主线程分离开,那么主线程执行完后,对象ca已经被销毁,但实际上在子线程上的对象并不是ca,而是ca的拷贝对象,它并没有被销毁,还存在与子线程中。

     1 class CA
     2 {
     3 public:
     4     void operator()() 
     5     {
     6         cout << "my_thread1" << endl;
     7         cout << "my_thread2" << endl;
     8         cout << "my_thread3" << endl;
     9         cout << "my_thread4" << endl;
    10         cout << "my_thread5" << endl;
    11     }
    12     CA()
    13     {
    14         cout << "调用构造函数" << endl;
    15     }
    16     CA(const CA&a) 
    17     {
    18         cout << "调用拷贝构造函数" << endl;
    19     }       
    20     ~CA()
    21     {
    22         cout << "调用析构函数" << endl;
    23     }
    24 };
    25 int main()
    26 {
    27     CA ca;
    28     thread my_threadObj(ca);        //创建一个子线程,可调用对象为ca
    29     if (my_threadObj.joinable())    //返回true代表没有使用join()或者detch()
    30     {
    31         my_threadObj.join();        //阻塞主线程,并让主线程等待子线程执行完
    32     }
    33     for (int i = 1; i <= 5; i++)
    34     {
    35         cout << "main_thread" << i << endl;
    36     }
    37     return 0;
    38 }

    2.用lambda表达式

     1 int main()
     2 {
     3     auto mylabda_thread = []
     4     {
     5         for (int i = 1; i <= 5; i++)
     6         {
     7             cout << "mythread" << i << endl;
     8         }
     9     };
    10     thread mythreadObj(mylabda_thread);
    11     mythreadObj.detach();
    12     for (int i = 1; i <= 5; i++)
    13     {
    14         cout << "main_thread" << i << endl;
    15     }
    16     return 0;
    17 }
  • 相关阅读:
    JS刷新当前页面的几种方法总结
    C#实现,C++实现,JS实现 阿拉伯数字金额转换为中文大写金额
    SQL server 生成数据字典
    jquery操作复选框(checkbox)的一些小技巧总结
    HTML中的几种空格
    C#几个经常用到的字符串截取
    关于百度地图API和jqGrid踩到的坑
    SQL常见问题积累
    JS实用小函数 数据是否合法或存在 获取当前日期时间
    vs2010 学习Silverlight学习笔记(13):数据与通信之WCF
  • 原文地址:https://www.cnblogs.com/main404/p/11148718.html
Copyright © 2011-2022 走看看