C++ Thread多线程并发记录(3)线程创建总结

1.启动线程传递全局函数

cpp 复制代码
#include <iostream>
#include <thread>

void Th1(int id){
    std::cout << "Create global fun. id = " << id << std::endl;
}
void TH1(const int &id){
    std::cout << "Create global fun. id = " << id << std::endl;
}

int main() {
    std::thread th1(Th1, 1);
    const int &num = 2;
    std::thread th2(Th1,std::ref(num));
    th1.join();//等待子线程结束后汇聚,注意同一个thread对象join两次会产生未定义行为
    th2.join();
    //th2.detach();//detach方法将线程变为守护进程,有可能出现主线程结束后,子线程还未结束的情况,故而不要使用detach线程访问栈内存
    return 0;
}

2.启动线程传递类成员函数

cpp 复制代码
#include <iostream>
#include <string>
#include <thread>

class TH1{
public:
    void print(){
        std::cout << name << std::endl;
    }
    std::string name{};
};
class TH2{
public:
    void operator()(std::string name) {
        std::cout << name << std::endl;
    }
};

int main() {
    TH1 t1;
    t1.name = "this is thread 1.";
    std::thread th1(&TH1::print, &t1);//传递类成员函数地址以及类实例地址
    std::thread th2((TH2()), "this is thread 2.");

    th1.join();
    th2.join();
    return 0;
}

3.传递Lambda表达式

cpp 复制代码
#include <iostream>
#include <string>
#include <thread>

int main() {
    std::string name{"This is thread 1."};
    std::thread t1([](const std::string &s){ std::cout << s << std::endl; }, std::ref(name));
    t1.join();
    return 0;
}

4.Thread RAII管理线程

cpp 复制代码
#include <iostream>
#include <string>
#include <memory>
#include <vector>
#include <thread>

class Thread_join {
public:
    Thread_join() = default;
    virtual ~Thread_join() = default;

    virtual void start() {
        thread_ = std::thread(&Thread_join::do_something, this); //传入基类指针产生动态绑定,根据动态类型选择虚函数类型
    };

    virtual void wait(){
        if (thread_.joinable())
            thread_.join();
    }
protected:
    std::thread thread_; //使用智能指针管理thread需要自定义
    virtual void do_something() = 0; //类中方法声明为纯虚函数
};

class TH1 : public Thread_join {
public:
    void do_something() override {
        for (const auto &i : s)
            std::cout << i << " ";
    }
private:
    std::vector<std::string> s{"This", "is", "thread", "RAII"};
};

int main() {
    TH1 t;
    t.start();
    t.wait();

    return 0;
}
cpp 复制代码
#include <iostream>
#include <string>
#include <vector>
#include <thread>

class Thread_join {
public:
    Thread_join() = default;
    virtual ~Thread_join(){
        if (thread_.joinable())
            thread_.join();
    }

    virtual void start() {
        thread_ = std::thread(&Thread_join::do_something, this); //传入基类指针产生动态绑定,根据动态类型选择虚函数类型
    };

    virtual void wait(){
        if (thread_.joinable())
            thread_.join();
    }
protected:
    std::thread thread_; //使用智能指针管理thread需要自定义
    virtual void do_something() = 0; //类中方法声明为纯虚函数
};

class TH1 : public Thread_join {
public:
    ~TH1() override{
        if (thread_.joinable())
            thread_.join();
    }
    void do_something() override {
        for (const auto &i : s)
            std::cout << i << " ";
    }
private:
    std::vector<std::string> s{"This", "is", "thread", "RAII"};
};

int main() {
    TH1 t;
    t.start();

    return 0;
}
相关推荐
Max_uuc几秒前
【C++ 硬核】打破嵌入式 STL 禁忌:利用 std::pmr 在“栈”上运行 std::vector
开发语言·jvm·c++
近津薪荼2 分钟前
dfs专题4——二叉树的深搜(验证二叉搜索树)
c++·学习·算法·深度优先
艾莉丝努力练剑42 分钟前
【Linux:文件】Ext系列文件系统(初阶)
大数据·linux·运维·服务器·c++·人工智能·算法
Once_day1 小时前
C++之《程序员自我修养》读书总结(1)
c语言·开发语言·c++·程序员自我修养
Trouvaille ~1 小时前
【Linux】TCP Socket编程实战(一):API详解与单连接Echo Server
linux·运维·服务器·网络·c++·tcp/ip·socket
坚果派·白晓明1 小时前
在鸿蒙设备上快速验证由lycium工具快速交叉编译的C/C++三方库
c语言·c++·harmonyos·鸿蒙·编程语言·openharmony·三方库
小镇敲码人1 小时前
深入剖析华为CANN框架下的Ops-CV仓库:从入门到实战指南
c++·python·华为·cann
张张努力变强2 小时前
C++ STL string 类:常用接口 + auto + 范围 for全攻略,字符串操作效率拉满
开发语言·数据结构·c++·算法·stl
小镇敲码人3 小时前
探索CANN框架中TBE仓库:张量加速引擎的优化之道
c++·华为·acl·cann·ops-nn
平安的平安3 小时前
面向大模型算子开发的高效编程范式PyPTO深度解析
c++·mfc