CPP创建子线程

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
#include<thread>
 
using namespace std;
 
struct MyStruct
{
      int a = 0;
      string s = "abc雷";
};//线程入口
void proc(MyStruct& a)
{
    for (int m = 0; m < 50; m++)
    {
        if (a.a == 0)
        {
            cout << "线程中断" << endl;
            break;
            
        }
 
        std::chrono::milliseconds sd(1000);
        this_thread::sleep_for(sd);
        cout << "我是子线程,传入参数为" << a.a << a.s<< endl;
        cout << "子线程中显示子线程id为" << this_thread::get_id() << endl;
    }   //函数执行完,线程停止
}
 
int main()
{    MyStruct my;
    my.a = 20;
    my.s = "aa雷";
 
    //thread th2(proc, &my);  //传递引用时要用ref才可,用&会失败,不了解这个     //thread th2(&proc, ref(my)); //线程入口加个&执行也没问题
    thread th2(proc, ref(my));//第一个参数为函数名,第二个参数为该函数的第一个参数,如果该函数接收多个参数就依次写在后面。此时线程开始执行。     //如果线程入口是成员变量,参考这个代码(在gitee上):this->th2 = new thread(&MySerialPort::读线程入口, this, 等待毫秒);
    cout << "主线程中显示子线程id为" << th2.get_id() << endl;
    //此处省略多行,不要在创建完线程后马上join,应该在程序结束前join
 
    this_thread::sleep_for(std::chrono::milliseconds(2000));  //主线程休眠2s
    my.a = 0;  //触发子线程停止
    th2.join();//此时主线程被阻塞直至子线程执行结束。
      
 
    std::cout << "Hello World!\n";
}

shared_mutex s_m;  //锁
s_m.lock();
//s_m.lock();
s_m.unlock();

 

  

posted @   81  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
历史上的今天:
2011-12-24 Windows进程间通信:共享内存
点击右上角即可分享
微信分享提示