目錄
- 1. mutex
- 2. lock_guard
- 3. unique_lock 是 lock_guard 的升級加強版
- 4. condition_variable
- 5. 調用
#include “thread”
#include “mutex”
#include “iostream”
//! std::thread
//! jion 阻塞式, .join()后面的代碼等待線程結束
//! detach 非阻塞式, 后面代碼繼續執行
1. mutex
類型 | 說明 |
---|---|
std::mutex | 最基本的 Mutex 類。 |
std::recursive_mutex | 遞歸 Mutex 類 |
std::time_mutex | 定時 Mutex 類 |
std::recursive_timed_mutex | 定時遞歸 Mutex 類。 |
std::mutex mtx;
int i = 0;
void add1()
{mtx.lock();for(int n = 0; n < 20; ++n)std::cout<<"add1 i = "<<++i<<std::endl;mtx.unlock();
}void add2()
{mtx.lock();for(int n = 0; n < 20; ++n)std::cout<<"add2 i = "<<++i<<std::endl;mtx.unlock();
}
2. lock_guard
//! 創建即加鎖,作用域結束自動析構并解鎖,無需手工解鎖
//! 不能中途解鎖,必須等作用域結束才解鎖
//! 不能復制
void add3()
{std::this_thread::sleep_for(std::chrono::milliseconds(10));std::lock_guard<std::mutex> lockg(mtx);for(int n = 0; n < 20; ++n){std::cout<<"add3 i = "<<++i<<std::endl;}
}void add4()
{std::this_thread::sleep_for(std::chrono::milliseconds(10));std::lock_guard<std::mutex> lockg(mtx);for(int n = 0; n < 20; ++n){std::cout<<"add4 i = "<<++i<<std::endl;}
}
3. unique_lock 是 lock_guard 的升級加強版
//! 創建時可以不鎖定(通過指定第二個參數為std::defer_lock),而在需要時再鎖定
//! 可以隨時加鎖解鎖
//! 作用域規則同 lock_grard,析構時自動釋放鎖
//! 不可復制,可移動
//! 條件變量需要該類型的鎖作為參數(此時必須使用unique_lock)
//! std::adopt_lock (必須先加鎖)
//! std::try_to_lock
//! std::defer_lock (必須手動加鎖)
void add5()
{//! std::adopt_lock//mtx.lock();//std::unique_lock<std::mutex> ulock(mtx, std::adopt_lock);// 先加鎖//! std::defer_lock//std::unique_lock<std::mutex> ulock(mtx, std::defer_lock);// 后手動加鎖//ulock.lock();//!std::unique_lock<std::mutex> ulock(mtx); //自動加鎖for(int n = 0; n < 20; ++n)std::cout<<"add5 i = "<<++i<<std::endl;
}void add6()
{//! std::adopt_lock//mtx.lock();//std::unique_lock<std::mutex> ulock(mtx, std::adopt_lock);//! std::defer_lock//std::unique_lock<std::mutex> ulock(mtx, std::defer_lock);//ulock.lock();//!std::unique_lock<std::mutex> ulock(mtx);for(int n = 0; n < 20; ++n)std::cout<<"add6 i = "<<++i<<std::endl;
}
4. condition_variable
std::condition_variable cv;
bool wait = false;
void printf1(int n)
{for (int i = 0; i < n; ++i) {std::unique_lock<std::mutex> ulock(mtx);if(wait) cv.wait(ulock);std::cout<<"printf1 " << i <<std::endl;wait = true;cv.notify_one();}
}void printf2(int n)
{for (int i = 0; i < n; ++i) {std::unique_lock<std::mutex> ulock(mtx);if(!wait) cv.wait(ulock);std::cout<<"printf2 " << i+10 <<std::endl;wait = false;cv.notify_one();}
}
5. 調用
//! 1.mutexstd::thread td(add1);std::thread td2(add2);td.join();td2.join();
//! 2. lock_guardstd::thread td3(add3);std::thread td4(add4);td3.detach();td4.detach();
//! 3. unique_lock
std::thread td5(add5);
std::thread td6(add6);
td5.detach();
td6.detach();
//! 4. condition_variable + unique_lock
std::thread td7(printf1, 10);
std::thread td8(printf2, 10);
td7.detach();
td8.detach();