c++11多线程学习

由来

读取大量数据文件的需求。

平台

支持c++11的编译器

以前的情况

在windows平台,MS提供里AfxBeginThreadAfxEndThread等一些多线程函数,但这些函数需要定义一个全局线程函数,不直观方便,而且传入的参数多的时候还要封装成结构并传递指针,线程内部再转换,很不方便。
好在,我们还有C++11。

简单例子

启动一个线程,然后等它结束:

#include <thread>         // std::thread

void foo() 
{
  // do stuff...
}

int main() 
{
  std::thread first (foo);  
  first.join();
}

稍微复杂的例子

传2个参数进去,如果是AfxBeginThread,那么就需要构造结构体了。

void foo(int x,int y)
{
  // x = 4, y = 5.
}
int main() 
{
  std::thread t(foo,4,5); // Acceptable.
  t.join(); 
}

类成员函数为线程函数的例子

线程函数在c++11以前是可以做类成员函数的,但是方法比较复杂,要么声明为静态函数,要么声明为friend,但这都破坏里类的封装性。c++11就不同里了。

class bar {
public:
  void foo() {
    // do stuff...
  }
};

int main()
{
  std::thread t(&bar::foo, bar());
  t.join();
}

再复杂点的例子

有时候不想再主线程里显式开线程,那么就在类成员函数里开就好了

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([=] { member1(); });
      }
      std::thread member2Thread(const char *arg1, unsigned arg2) 
      {
          return std::thread([=] { member2(arg1, arg2); });
      }
};

int main(int argc, char **argv) 
{
   Wrapper *w = new Wrapper();
   std::thread tw1 = w->member1Thread();
   std::thread tw2 = w->member2Thread("hello", 100);
   tw1.join();
   tw2.join();
   return 0;
}

注意这里线程成员函数使用里lambda匿名函数,并且使用里[=]捕获变量,在传入的参数不是指针的时候,使用引用[&]

参考文献

1.std::thread
2.c++11 线程:让你的多线程任务更轻松
3.Start thread with member function

你可能感兴趣的:(thread,多线程,C++11)