首页 > 编程语言 > 详细

【C++多线程】lock_guard<T>类和unique_lock<T>类

时间:2020-06-07 22:57:07      阅读:57      评论:0      收藏:0      [点我收藏+]

lock_guard<T>

  使用的RAII机制,互斥量在lock_guard<T>对象构造时lock,在其析构时unlock。主要是为了解决在手动lock和unlock时忘记unlock的情况。

unique_lock<T>

  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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!