目录
1--std::unique_lock的使用
std::unique_lock<std::mutex> guard1(my_mutex1)
std::mutex *ptr = guard1.release();
...
// 需手动解锁
ptr->unlock();
1-1--std::adopt_lock参数
// example
my_mutex1.lock();
// my_mutex1 手动进行lock()以后,在使用std::unique_lock应添加std::adopt_lock参数
std::unique_lock<std::mutex> guard1(my_mutex1, std::adopt_lock);
1-2--std::try_to_lock参数
#include <iostream>
#include <thread>
#include <list>
#include <mutex>
class myClass{
public:
// 收集数据到消息队列
void inMsgRecvQueue(){
for(int i = 0; i < 100; i++){
std::unique_lock<std::mutex> guard1(my_mutex1, std::try_to_lock);
if(guard1.owns_lock()){ // 获取锁,执行临界区
std::cout << "Running inMsgRecvQueue(), insert one value: "
<< i << std::endl;
msgRecvqueue.push_back(i); // 消息队列存储消息
}
else{ // 无法获取锁,执行其他工作
std::cout << "Running inMsgRecvQueue(), do other works" << std::endl;
}
}
}
// 从消息队列取数据
void outMsgRecvQueue(){
for(int i = 0; i < 100; i++){
if(!msgRecvqueue.empty()){
// 获取锁后休息10s
std::unique_lock<std::mutex> guard1(my_mutex1);
std::chrono::microseconds dura(20000); // 10000ms
std::this_thread::sleep_for(dura);
// 取出数据
int command = msgRecvqueue.front();
msgRecvqueue.pop_front();
}
else{
std::cout << "Running outMsgRecvQueue(), "
"the msgRecvqueue is empty" << std::endl;
}
}
}
private:
std::list<int> msgRecvqueue; // 消息队列
std::mutex my_mutex1; // 创建互斥量
};
int main(int argc, char *argv[]){
myClass sample1;
std::thread myInMsgObj(&myClass::inMsgRecvQueue, &sample1); // 收集数据线程
std::thread myOutMsgObj(&myClass::outMsgRecvQueue, &sample1); // 取出数据线程
myInMsgObj.join();
myOutMsgObj.join();
return 0;
}
1-3--std::defer_lock参数
1-4--互斥量所有权转移
std::unique_lock<std::mutex> guard1(my_mutex1);
std::std::unique_lock<std::mutex> guard2(std::move(guard1));