C++ thread 实现参考

参考1:

#include <thread>
#include <iostream>

class Wrapper 
{
  public:
      void member1() 
      {
          std::cout << "i am member1" << std::endl;
      }
      void member2(const char *arg1, unsigned arg2) 
      {
          std::cout << "i am member2 and my first arg is (" << arg1 << ") and second arg is (" << arg2 << ")" << std::endl;
      }
      std::thread member1Thread() 
      {
          return std::thread(&Wrapper::member1, this);
      }
      std::thread member2Thread(const char *arg1, unsigned arg2) 
      {
          return std::thread(&Wrapper::member2, this, arg1, arg2);
      }
};

int main() 
{
  Wrapper *w = new Wrapper();
  std::thread tw1 = w->member1Thread();
  tw1.join();
  w->member2Thread("hello", 100).detach();

  return 0;
 }
join()为主线程等待子线程的阻塞模式

detach()为主线程不管子线程的非阻塞模式

参考2:

①创建一个类,并编写圆括号重载函数,初始化一个该类的对象,把该对象作为线程入口地址

class Ta
{
public:
    void operator()()
    {
        cout << "我的线程开始运行" << endl;
        //-------------
        //-------------
        cout << "我的线程运行完毕" << endl;
    }
};

//main函数里的:
    Ta ta;
    thread myThread(ta);
    myThread.join();


②lambda表达式创建线程

//main函数中
auto lambdaThread = [] {
        cout << "我的线程开始执行了" << endl;
        //-------------
        //-------------
        cout << "我的线程开始执行了" << endl;
    };

    thread myThread(lambdaThread);
    myThread.join();



③把某个类中的某个函数作为线程的入口地址

class Data_
{
public:
    void GetMsg(){}
    void SaveMsh(){}
};
//main函数里
    Data_ s;
    //第一个&意思是取址,第二个&意思是引用,相当于std::ref(s)
    //thread oneobj(&Data_::SaveMsh,s)传值也是可以的
    //在其他的构造函数中&obj是不会代表引用的,会被当成取地址
    //调用方式:对象成员函数地址,类实例,[成员函数参数]
    //第二个参数可以传递对象s,也可以传递引用std::ref(s)或&s
    //传递s,会调用拷贝构造函数在子线程中生成一个新的对象
    //传递&,子线程中还是用的原来的对象,所以就不能detach,因为主线程运行完毕会把该对象释放掉
    thread oneobj(&Data_::SaveMsh,&s);
    thread twoobj(&Data_::GetMsg,&s);
    oneobj.join();
    twoobj.join();


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值