使用的RAII机制,互斥量在lock_guard<T>对象构造时lock,在其析构时unlock。主要是为了解决在手动lock和unlock时忘记unlock的情况。
类unique_lock<T> 是通用互斥包装器,允许延迟锁定、锁定的有时限尝试、递归锁定、所有权转移和与条件变量一同使用。相比lock_guard<T>更加灵活,能够在需要是lock,用完后unlock,当生命周期结束时若此时互斥量没有解锁,也会像lock_guard<T>一样析构解锁。也就是说类 unique_lock<T>是类lock_guard<T>的一个超集。以下是cppreference.com对unique_lock<T>的说明。
1 #include <iostream> 2 #include <thread> 3 #include <mutex> 4 #include <list> 5 using namespace std; 6 7 class A { 8 public: 9 void input() 10 { 11 for (int i = 0; i < 1000; i++) 12 { 13 // lock_guard<mutex> guard(my_mutex); 14 unique_lock<mutex> my_lock(my_mutex); //构造时自动lock 15 ilst.push_back(i); 16 my_lock.unlock(); //在生命周期结束前提前unlock,为其他线程执行争取时间 17 cout << "加入数据:" << i << endl; 18 my_lock.lock(); //在需要时又重新上锁 19 20 //do something with my_mutex 21 22 } //生命周期结束,自动在析构函数中unlock 23 24 } 25 26 void output() 27 { 28 for (int i = 0; i < 1000; i++) 29 { 30 // lock_guard<mutex> guard(my_mutex); 31 unique_lock<mutex> my_lock(my_mutex); 32 if (!ilst.empty()) 33 { 34 cout << "读读读读出数据:" << ilst.front() << endl; 35 ilst.pop_front(); 36 } 37 } 38 } 39 40 private: 41 list<int> ilst; 42 mutex my_mutex; 43 }; 44 45 int main() 46 { 47 A a; 48 thread t1(&A::input, &a); //注意此处需要传入的是对象地址,否则数据没办法共享 49 thread t2(&A::output, &a); 50 t1.join(); 51 t2.join(); 52 return 0; 53 }
【C++多线程】lock_guard<T>类和unique_lock<T>类
原文:https://www.cnblogs.com/chen-cs/p/13062647.html