c++11线程

本文介绍了C++11中的线程使用,包括通过函数、对象、lambda表达式以及类成员方法创建线程。同时,讨论了如何保护共享数据,如使用互斥量、条件变量和原子操作来实现线程同步。还提到了C++11线程延时模板类对象以及线程池的概念。
摘要由CSDN通过智能技术生成

线程头文件:#include<thread>

1.以函数方法创建线程:

//1.写一个创建的线程执行的函数
void myprint()
{
cout<<"xdxc"<<endl;


cout<<"wdxcjs"<<endl;
}

//2.创建的线程

第一种方式:
(1)std::thread mytobj(myprint);//创建一个线程对象并且启动线程
(2)mytobj.join();//主线程等待mytobj执行完毕在执行
第二种方式:
(1)std::thread mytobj(myprint);//创建一个线程对象并且启动线程
(2)mytobj.detach();//主线程不用等待子线程执行结束,自己就可以先结束,主线程内存由c++运行库回收
提示:写了一种方式就不能在用另外一种方式,也不能重复写一种方式,如果这样写就会报错。

判断线程有没有用过哪一种方式:
if(mytobj.joinable())
{

}


注:如果线程执行的函数有参数,那么std::thread构造函数从第二个参数开始就是线程执行函数的参数以此类推,但是如果是以主线程不等待子线程的方式开启的线程传递类对象参数有隐式转化的话,可能会主线程执行完了子线程还没有隐私转化完成,又因为隐私转化是在子线程里面进行的,所以可能会出错。

传递类对象应该以匿名对象的方式传送就不会出现问题,因为匿名对象是在主线程中完成的比如string hh="saxa";string(hh);。

结论:
(1)传递int这样的类型尽量不用传送引用,更加不用传送指针。
(2)类对象传送引用,以匿名的方式传送。
(3)不管传送引用还是赋值都是拷贝,并不是本身地址,指针除外。
(4)如果传送引用执意要传送本身的真实地址用std::ref(hh);
(5)或取线程id号的方法:std::this_thread::get_id();


2.以对象方式创建线程:

1.创建一个用来线程执行的类;
class TB
{
   public:
   void  operator()()
   {
        cout<<"这个是一个子线程"<<end;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值