c++11 thread 类内使用方法和跨类使用方法

忘了为啥之前查的用上bind了,把项目搞完之后终于有时间建个小工程仔细试下怎么用。

Case 1 : 根据类内函数创建thread

class A
{
public:
 A();
 ~A();
 void run(int i) {
  cout << i << endl;
 }
 void thread_run() {
  for (int i = 0; i < 5; ++i) {
   thread t( &A::run, this, i);
   t.join();
  }
 }
};


int main() {

 A a;
 a.thread_run();

 return 0;
}



Case 2 : 在类外根据某一个类的函数创建thread

class A
{
public:
 A();
 ~A();
 void run(int i) {
  cout << i << endl;
 }
};



int main() {

 A a;
 for (int i = 0; i < 5; ++i) {
  thread t(&A::run, &a, i);
  t.join();
 }

 return 0;
}


Case 3 : 在一个类中根据另一个类的函数创建thread

class A
{
public:
 A();
 ~A();
 void run(int i) {
  cout << i << endl;
 }
};


class B
{
public:
 B();
 ~B();
 void run() {
  A a;
  for (int i = 0; i < 1000; ++i) {
   thre.fdad t(&A::run, &a, i);
   t.join();
  }
 }
};

int main() {
 A a;
 B b;
 b.run();
 return 0;
}

居然都是完全没问题的!!!我就奇怪了当初在工程里为毛怎么都不行。

注意点大概如下:
1. thread的第一个参数一定是 &类名::函数名 的形式
2. thread的第二个参数一定是类实例的指针
3. thread的之后的参数是函数所需要的参数

另外这样for循环创建的thread一定是执行完一个线程才创建下一个线程的,如果想要线程一起创建,需要先用一个vector把创建的thread存起来(千万不能直接存实例,因为vector在push_back时会再次构造),之后再一个for循环一起join;或者直接把join改成detach。

比较坑的地方可能就是thread传入类的函数和全局函数或者static函数时,参数是有区别的(后两个不需要类实例的指针),可能就是因为这个才让我当初怎么搞都没搞通吧。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值