当前位置 : 主页 > 编程语言 > c++ >

C++并发(C++11)-02线程管理基础

来源:互联网 收集:自由互联 发布时间:2021-06-23
线程的执行时机 线程在其对象被创建后立即执行。 等待线程和分离线程 线程创建后通过调用thread对象的join()或detach()函数决定线程是等待还是分离; 不能对没有执行线程的thread对象使

线程的执行时机

  线程在其对象被创建后立即执行。

等待线程和分离线程

  1. 线程创建后通过调用thread对象的join()或detach()函数决定线程是等待还是分离;
  2. 不能对没有执行线程的thread对象使用join()或detach();
  3. 使用join()或detach()之前应对thread对象进行判断,t.joinable()返回为true时才可使用。

detach()

  detach()用于分离线程,一般在线程被创建后立即调用。其相关资源由系统回收。

join()

  1. join()会等待线程完成(join()后的代码在线程及其相关代码执行完成后才会执行),并回收线程的资源;
  2. 一个线程对象只能被join()一次;
  3. join()的位置要精心挑选,如果在join()之前抛出异常或返回,join()就不会被执行,线程的相关资源就不会被及时回收(进程结束后被操作系统回收)。
    #include <iostream>
    #include <thread>
    using namespace std;
    
    void func(int m) {
      for (size_t i = 0; i < 1000; i++) {
        cout << m++ << endl;
      }
    }
    
    int main() {
      int m = 0;
      thread my_thread(func, m);
      throw exception();
      my_thread.join();//不会被执行
      return 0;
    }
    
    //
    void func(int m) {
      for (size_t i = 0; i < 1000; i++) {
        cout << m++ << endl;
      }
    }
    
    int main() {
      int m = 0;
      thread my_thread(func, m);
      try {
        throw exception();
      } catch (const std::exception& e) {
        my_thread.join();  //会被执行
        throw e;
      }
      my_thread.join();  //不会被执行
      return 0;
    }
网友评论