//创建线程
std::thread t(functionname,args...)
t.join() 主程序等待线程结束
t.joinable() 是否可以调用join() 函数
std::ref 传递引用类型
用智能指针解决 外部对象调用私有成员函数可以使用友元
数据竞争问题 mutex 写操作之前加锁,操作完解锁 mtx.lock()
mtx.unlock()
std::lock_guard: 当构造函数被调用时,互斥量会被自动锁定 析构函数调用自动解锁 lock guard 不能复制或者移动,只能在作用域中出现
std::lock_guard<std::mutex> lg(mtx);
std::unique lock: 对互斥量更加灵活管理,包括延迟加锁、条件变量、超时等。
单例模式 饿汉模式:用到的时候才构造 懒汉模式:直接构造好 std::once_flag std::call_once(once,function_name)
生产者与消费者模型 std::condition_variable:
- 创建一个std::condition_variable对象
- 创建一个互斥锁,保护共享资源的访问
- 在需要等待条件变量的地方 使用std::unique_lockstd::mutex对象锁定互斥锁 调用std::condition_variable::wait()、std::condition_variable::wait_for()、 std::condition_variable::wait_until() 函数等待条件变量
- 在其他线程中需要通知等待的线程时,调用 std::condition_variable::notify_on()、std::condition_variable::notify_all() 通知等待的线程
维护一个线程数组和任务队列,让线程完成队列里的任务 完美转发:
template<typename T>
void perfect_forward(T&& arg) {
another_function(std::forward<T>(arg));
}
// 假设我们有一个函数可以处理不同类型和值类别的参数
void another_function(int& lvalue) {
// ...
}
void another_function(int&& rvalue) {
// ...
}
// 使用完美转发
int main() {
int x = 10;
perfect_forward(x); // 转发左值引用
perfect_forward(20); // 转发右值引用
return 0;
}