C++ 创建一个线程

直接看代码:注意c++在运行一个可执行程序的时候(创建了一个进程),会自动的创建一个主线程,这个主线程和进程同生共死,主线程结束,进程也就结束了。

#include "pch.h"
#include <iostream>
#include<thread>
void print1()
{
    cout << "print1_1线程执行" << endl;
    cout << "print1_2线程执行" << endl;
    cout << "print1_3线程执行" << endl;
}
using namespace std;
int main()
{
    thread mythread1(print1);
    mythread1.join();
    //mythread1.detach();
    cout << "主线程执行" << endl;
    return 0;
}

thread mythread1(print1)创建一个线程mythread1,print1()是该线程的初始函数(执行函数)。

mythread1.join();阻塞主线程,等待mythread1这个线程执行完毕在继续执行,推荐这种做法。

mythread1.detach();分离,使主线程和线程mythread1分离,主线程可以先执行结束,如果主线程执行完了,子线程会在c++后台运行,一旦使用detach(),与这个子线程关联的对象会失去对这个主线程的关联,此时这个子线程会驻留在c++后台运行,当主线程执行完毕结束,子线程会移交给c++运行时库管理,这个运行时库会清理与这个线程相关的资源(守护线程),detach()会是子线程失去进程的控制,所以建议不要使用detach(),建议使用jion()。

return 0;表示主线程执行完毕,表明进程即将退出。

 

二、用类对象创建一个线程

直接看代码:

#include "pch.h"
#include <iostream>
#include<thread>
class T
{
public:
    /*情况一:
    int &it;//一个进程中的所有线程共享同一块内存(内存共享),在线程中使用引用其实是不安全的
    T(int &m_it) :it(m_it)
    {
        cout << "构造函数被执行" << endl;
    }
    */
    //不能用引用,应该像下面这样用
    int it;
    T(int m_it) :it(m_it)
    {
        cout << "构造函数被执行" << endl;
    }
    T(const T &t) :it(t.it) {
        cout << "拷贝构造函数被执行" << endl;
    }
    ~T()
    {
        cout << "析构函数被执行" << endl;
    }
    void operator()()
    {
        cout << "it值:" << it << endl;
    }
};
int main()
{
    int itm = 8;
    T t(itm);//调用了构造函数
    thread mythread2(t);
    mythread2.join();
    //mythread2.detach();
    cout << "主线程执行" << endl;
    return 0;
}

thread mythread2(t);调用了拷贝构造函数

mythread2.detach();情况一的时候,这里绝对不能用detach(),因为类成员变量是一个引用,这里的itm等主线程执行完毕之后内存会回收,所以子线程打印的变量无效,这是一个重大的bug。一定要注意,最安全的做法就是直接使用值传递,生成一个副本,这样使用detach()就不会有错。

这里还有一个疑问?为什么使用detach(),主线程执行结束之后,用t这个局部对象没有问题,t按理说会被系统回收之后就有问题了呀?
答:虽然t这个对象不在了(肯定会被回收),但是创建子线程的时候,这个对象t是被拷贝到子线程中去了的,所以用detach()而且主线程执行完毕后,子线程还是会继续执行,这是没有问题的.t被销毁,但是被复制到线程中去的对象依然存在。

三、用lambda表达式创建一个线程

#include <iostream>
#include<thread>
using namespace std;
int main()
{
    //用lambda表达式创建一个线程
    auto mylamthread = [] {//这是一个lambda表达式
        cout << "我的线程开始执行了" << endl;
        //......
        cout << "我的线程执行结束了" << endl;
    };
    thread mythread3(mylamthread);
    mythread3.join();
    cout << "主线程执行结束" << endl;
    return 0;//表示主线程执行结束,表明进程结束
}

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值