1 C++11多线程thread
重点:
- join和detach的使用场景
- thread构造函数参数
- 绑定c函数
- 绑定类函数
- 线程封装基础类
- 互斥锁mutex
- condition notify、wait
- lock_guard/unique_lock
- function和bind
- 异步future/packaged_task/promise
- 线程池的实现,线程池涉及的技术点
1.1 thread
std::thread 在 #include 头文件中声明,因此使用 std::thread 时需要包含 #include 头文件。
1.1.1语法
构造函数
- 默认构造函数
//创建一个空的thread执行对象。
thread() _NOEXCEPT
{ // construct with no thread
_Thr_set_null(_Thr);
}
- 初始化构造函数
//创建std::thread执行对象,该thread对象可被joinable,新产生的线程会调用threadFun函数,该函
数的参数由 args 给出
template<class Fn, class... Args>
explicit thread(Fn&& fn, Args&&... args);
- 拷贝构造函数
// 拷贝构造函数(被禁用),意味着 thread 不可被拷贝构造。
thread(const thread&) = delete;
- Move构造函数
/move 构造函数,调用成功之后 x 不代表任何 thread 执行对象。
注意:可被 joinable 的 thread 对象必须在他们销毁之前被主线程 join 或者将其设置为
detached。
thread(thread&& x)noexcept
#include<iostream>
#include<thread>
using namespace std;
void threadFun(int& a) // 引用传递
{
cout << "this is thread fun !" << endl;
cout << " a = " << (a += 10) << endl;
}
int main()
{
int x = 10;
thread t1(threadFun, std::ref(x));
thread t2(std::move(t1)); // t1 线程失去所有权
thread t3;
t3 = std::move(t2); // t2 线程失去所有权
//t1.join(); // ?
t3.join();
cout << "Main End " << "x = " << x << endl;
return 0;
}