构造函数
thread() noexcept;
template <class Fn, class... Args>
explicit thread (Fn&& fn, Args&&... args);
thread (const thread&) = delete;
thread (thread&& x) noexcept;
常用方法
void join();
void detach();
- join()等待子线程执行完之后,主线程才可以继续执行下去,此时主线程会释放掉执行完后的子线程资源
- detach()将子线程从主线程里分离,子线程执行完成后会自己释放掉资源。分离后的线程,主线程将对它没有控制权了
使用前说明
- std::thread 在
<thread>
头文件中声明,因此使用 std::thread 时需要包含 <thread>
头文件 - 可被 joinable 的 thread 对象必须在他们销毁之前被主线程 join 或者将其设置为 detached.
- Unix平台需要增加编译参数
-lpthread
或者-pthread
(推荐)
普通函数实现多线程
void fun(int arg)
{
cout<<"thread fun:"<<arg<<endl;
}
std::thread t1(fun,1024);
t1.join();
类成员函数
class Task
{
public:
void fun(int id)
{
cout<<"Task fun:"<<id<<" "<<this<<endl;
}
void fun1(int id,int id2)
{
cout<<"Task fun:"<<id<<" "<<id2<<" "<<this<<endl;
}
};
Task task;
std::thread t3(&Task::fun,&task,123);
t3.join();
绑定函数
Task task;
auto fun = std::bind(&Task::fun,&task,456);
std::thread t4(fun);
t4.join();
std::function<void(Task*,int,int)> fun111 =&Task::fun1;
std::thread t5(fun111,&task,1,3);
t5.join();
lambda表达式
std::thread t2([]{std::cout<<"thread1"<<endl;});
t2.join();