美文网首页
用C++11多线程库thread创建线程

用C++11多线程库thread创建线程

作者: 是你亮哥哥呀 | 来源:发表于2019-08-28 19:09 被阅读0次

一、函数方式

  1. thread
    C++11标准线程库,创建线程:
thread mythread(函数名);
thread mythread(函数名,参数列表);
thread mythread(类对象);
  1. join()
    mythread.join();
    阻塞主线程,让主线程等待子线程执行完毕,然后和主线程回合,主线程继续向下执行。
  2. detach()
    mythread.detach();
    主线程和子线程分离,主线程和子线程同时执行,主线程不必等待子线程结束,子线程进入后台(守护线程),由运行时库接管。
  3. joinable()
    mythread.joinable()
    判断是否可以join或者detach,返回true,可以join可以detach, 返回false, 不能join不能detach

示例

#include <iostream>
#include <thread>
using namespace std;

void myprint(int n) {
    cout << "我的线程开始了" << endl;
    // ....
    for (int i = 0; i < n; i++) {
        cout << "--->子线程第" << i + 1 << "项操作。" << endl;
    }
    cout << "我的线程结束了" << endl;
}
int main() {
    const int n = 10;
    thread mythread(myprint, n);
    //mythread.join(); //阻塞主线程,让主线程等待子线程执行完毕,然后和主线程回合,主线程继续向下执行。
    mythread.detach(); //主线程和子线程分离,主线程和子线程同时执行,主线程不必等待子线程结束,子线程进入后台(守护线程),由运行时库接管。
    /*
    注意事项:detach分离后,主线程如果先结束,子线程如果还用到主线程的资源则会出错,比如引用
    */
    for (int i = 0; i < n; i++) {
        cout << "main thread" << endl;
    }
    cout << "主线程结束!" << endl;
    
    return 0;
}

二、可执行的类对象

#include <iostream>
#include <thread>
using namespace std;

class TA {
public:
    int &m_i; //bug, 一旦使用了detach,主线程先结束,引用的地址就会出现不可预料的结果,要么食用join方式,要么用拷贝(不要用引用)
    TA(int &i) :m_i(i) {
        cout << "constructor" << endl;
    }
    TA(const TA& ta) :m_i(ta.m_i) {
        cout << "copy constructor" << endl;
    }
    ~TA() {
        cout << "deconstructor" << endl;
    }
    void operator() () {
        
        cout << "m_i的值:" << m_i << endl;
        cout << "m_i的值:" << m_i << endl;
    }
};
int main() {
    int i = 1;
    TA ta(i);
    thread mythread(ta);
    //mythread.join(); //阻塞主线程,让主线程等待子线程执行完毕,然后和主线程回合,主线程继续向下执行。
    mythread.detach(); //主线程和子线程分离,主线程和子线程同时执行,主线程不必等待子线程结束,子线程进入后台(守护线程),由运行时库接管。
    /*
    注意事项:detach分离后,主线程如果先结束,子线程如果还用到主线程的资源则会出错,比如引用
    主线程结束后,ta对象会被销毁,但是不影响子线程,因为ta对象是被复制到线程中去的
    */
    for (int i = 0; i < 10; i++) {
        cout << "main thread" << endl;
    }
    cout << "主线程结束!" << endl;

    return 0;
}

踩坑事项:数据最好拷贝到子线程中去,要使用引用的话,必须用join方式。

三、lamda表达式

#include <iostream>
#include <thread>
using namespace std;

int main() {
    auto mylamda = [] {
        cout << "lamda方式的子线程" << endl;
    };
    thread mythread(mylamda);
    //mythread.join(); //阻塞主线程,让主线程等待子线程执行完毕,然后和主线程回合,主线程继续向下执行。
    mythread.detach(); //主线程和子线程分离,主线程和子线程同时执行,主线程不必等待子线程结束,子线程进入后台(守护线程),由运行时库接管。
    
    for (int i = 0; i < 10; i++) {
        cout << "main thread" << endl;
    }
    cout << "主线程结束!" << endl;

    return 0;
}

相关文章

  • C++11 标准库 std::thread 多线程使用教程

    从 C++11 开始,标准库里已经包含了对线程的支持,std::thread是C++11标准库中的多线程的支持库,...

  • c++11多线程编程

    C++11的多线程编程方式 std::thread 在c++11的标准里,线程已经由标准库提供:std::thre...

  • 用C++11多线程库thread创建线程

    一、函数方式 threadC++11标准线程库,创建线程: join()mythread.join();阻塞主线程...

  • C++多线程

    看完了b站上的c++多线程视频,这里留作记录。 创建、销毁线程 在c++11中,一般使用thread创建线程,传入...

  • 10.3多线程详解

    Java高级-多线程 多线程创建 多线程通讯 线程池 1.多线程创建 thread/runnable图:继承Thr...

  • C++ 11 thread类多线程笔记

    C++11中std命名空间将Boost库中的Thread加入到标准库 中,Boost的多线程从准标准变为标准。 创...

  • Python 多线程笔记

    Python 多线程笔记 创建线程 1. 使用函数创建多线程 2. 使用类创建多线程 继承 Thread 类 重写...

  • C++并发编程原理

    C++11多线程API std::thread std::mutex std::future std::async...

  • 学习笔记(一)

    对多线程的认识 创建线程的方法 继承Thread和实现Runnable。用Runnable接口创建的线程可以处理同...

  • 源码修炼笔记之线程池ThreadPoolExecutor详解

    多线程编程过程中,用new Thread()的方式需要频繁的创建和销毁线程,线程的创建存在系统调用clone(),...

网友评论

      本文标题:用C++11多线程库thread创建线程

      本文链接:https://www.haomeiwen.com/subject/pesmectx.html