- 包含头文件 #include <thread>
- 创建线程 t1: thread t1(函数名);
- 主线程等待t1线程结束后再运行 : t1.join()
- 主线程不需要等待t1线程结束: t1.detach() *线程一旦被detach便不能再join
- 判断线程能否 join : t1.joinable()
- *线程对象不能被赋值 “ = ” , 只能被移动 “ move() ”
- 输出当前线程ID : this_thread::get_id();|| t1.get_id()
- 当前CPU可执行的进程数: hardware_concurrency();
- 解决互斥竞争所包含头文件 #include <mutex> ,创建互斥对象mutex mu;
- 对互斥资源的占领: mu.lock(); 释放:mu.unlock()
- * * 如果互斥资源发生异常,互斥对象mu讲会被一直占领
- lock_guard
- unique_lock: 为指定的某行代码添加lock();
- ** lock_guard 不能移动lock , unique_lock 可以移动lock ;且unique_lock比 lock_guard更耗费系统资源
-
避免死锁的方式:
-
尽量使用一个mutex
-
使用多个mutex时,保证locker顺序一致
-
或者使用lock()对互斥资源占领
-
once_flag
-
call_once
条件变量
- 头文件 #include <condition_variable>
- 定义条件变量cv: std::condition_variable cv;
- 若线程1中使用 cv.notify_one();//唤醒包含cv.wait()函数的线程
future async promis :在不同线程之间传递数据,
- 包含头文件: #include <future>
- std::future<int> fu = std::async ( (默认参数 可省略),函数名 ,传递参数)
- fu.get()取得目标函数返回值,但注意get()只能被调用一次
- 默认参数有:std::launch::deferred || std::launch::async ,
- std::launch::async 当返回的future失效前会强制执行目标函数,即不调用future.get也会保证目标函数的执行。但std::launch::deferred 仅当调用future.get()时才会执行目标函数,如果创建async时不指定launch policy,他会默std::launch::async|std::launch::deferred,根据情况选一种执行 【此小点参考:https://blog.csdn.net/racaljk/article/details/80142353】
- 定义一个int型的 promise 变量并命名为p : std::promise<int> p;
- std::future<int> f = p.get_future () ;
- p.set_value( );
- promise和future只能move