05 使用C++11让多线程开发变得简单
std::thread
#include <thread>void func(){// do some work}int main(){std::thread t(func);t.join();return 0;}
gcc注意加
-pthread编译选项
func函数将会运行与线程对象中t中,join函数将会阻塞线程,直到线程函数执行结束, 如果线程函数有返回值,返回值将被忽略
如果不希望线程被阻塞执行,可以调用线程的detach()方法, 将线程和线程对象分离.
通过 detach, 线程就和线程对象分离了,让线程作为后台线程去执行,当前线程也不会阻塞了。但需要注意的是,detach 之后就无法再和线程发生联系了,比如 detach 之后就不能再通过 join 来等待线程执行完,线程何时执行完我们也无法控制了
#include <thread>void func(){// do some work}int main(){std::thread t(func);t.detach();return 0;}
线程还可以接收任意个数的参数
#include <thread>#include <iostream>void func(int i, double d, const std::string& s){std::cout << i << ", " << d << ", " << s << "\n";}int main(){std::thread t(func, 1, 2, "test");t.join();return 0;}
std::thread出了作用域之后将会析构,这时如果线程函数还没有执行完则会发生错误,因此,需要保证线程函数的生命周期在线程变量std::thread的生命周期之内
#include <thread>void func(){// do some work}int main(){std::thread t(func);std::thread t1(std::move(t));// t.join(); // 会报错t1.join();return 0;}
线程被移动之后,线程对象t将不再代表任何线程了
可以通过std::bind或lambda表达式来创建线程
