1.unique_lock
1. unique_lock<mutex> myUniLock(myMutex); 完全可以取代lock_guard
2. unique_lock 也可以使用----std::adopt_lock
3.使用adopt_lock,之前要先使用lock.
4.std::chrono::milliseconds my_sleepTime(20000)//20000毫秒
std::this_thread::sleep_for(my_sleep);// 开始休息20秒
关键词1:try_to_lock
- 尝试用mutex的lock()去锁定这个mutex,但如果没有锁定成功,会立即返回,不会阻塞在那里;
- 使用try_to_lock的原因是防止其他的线程锁定mutex太长时间,导致本线程一直阻塞在lock这个地方
- 前提:不能提前lock();
- owns_lock()方法判断是否拿到锁,如拿到返回true
关键词2:defer_lock
- 如果没有第二个参数就对mutex进行加锁,加上defer_lock是始化了一个没有加锁的mutex
- 不给它加锁的目的是以后可以调用unique_lock的一些方法
- 前提:不能提前lock
- 不用自己unlock,有点类似智能指针;当然也可以自己提前解锁
关键词3:try_lock():尝试给互斥量加锁
如果拿不到锁,返回false,否则返回true。
关键词4:release()
2.总结
adopt_lock:
使用之前先lock,不能自己unlock
my_mutex.lock();
unique_lock<mutex> myUniLock(my_mutex,adopt_lock);
{ //my_mutex.lock();my_list.push_back(i);cout << "插入元素:" << i << endl;//my_mutex.unlock();
}
try_to_lock
使用之前不能先lock, try_to_lock会自己先尝试进行加锁。如果不能加锁,通过判断直接执行其他
defer_lock 见上
#include<iostream>
#include<list>
#include<thread>
#include<mutex>using namespace std;
class son_thread {
public:void product() {for (int i = 0; i < 10000; i++) {unique_lock<mutex> myUniLock(my_mutex, defer_lock);myUniLock.lock();{ //my_mutex.lock();my_list.push_back(i);cout << "插入元素:" << i << endl;//my_mutex.unlock();}//my_mutex.unlock();}}void consume() {my_mutex.lock();if (my_list.empty()) {cout << "容器为空" << endl;}else {cout << " 进行消费" << my_list.front() << endl;my_list.pop_front();}my_mutex.unlock();}void consume_continue() {while (1) {this->consume();}}
private:std::mutex my_mutex;list<int>my_list;
};int main() {son_thread s1;thread obj1(&son_thread::product, &s1);thread obj2(&son_thread::consume_continue,&s1);obj1.join();obj2.join();return 0;
}