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函数时,参数是有区别的(后两个不需要类实例的指针),可能就是因为这个才让我当初怎么搞都没搞通吧。

猜你喜欢

转载自blog.csdn.net/gychixxx/article/details/78875061