由来
读取大量数据文件的需求。
平台
支持c++11的编译器
以前的情况
在windows平台,MS提供里AfxBeginThread
,AfxEndThread
等一些多线程函数,但这些函数需要定义一个全局线程函数,不直观方便,而且传入的参数多的时候还要封装成结构并传递指针,线程内部再转换,很不方便。
好在,我们还有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