• 【thread】shared_mutex


    std::shared_mutex

    1. 原型:

    读写锁属性相关理论:【Liux系统编程】读写锁

    1)测试用例:

    #include <iostream>
    #include <mutex>
    #include <shared_mutex>
    #include <thread>
    
    class ThreadSafeCounter {
     public:
      ThreadSafeCounter() = default;
    
      unsigned int get() const {
        std::shared_lock lock(mutex_);
        return value_;
      }
    
      unsigned int increment() {
        std::unique_lock lock(mutex_);
        return ++value_;
      }
    
      void reset() {
        std::unique_lock lock(mutex_);
        value_ = 0;
      }
    
     private:
      mutable std::shared_mutex mutex_;
      unsigned int value_ = 0;
    };
    
    int main() {
      ThreadSafeCounter counter;
    
      auto increment_and_print = [&counter]() {
        for (int i = 0; i < 3; i++) {
          std::cout << std::this_thread::get_id() << "-" << counter.increment() << std::endl;
        }
      };
    
      std::thread thread1(increment_and_print);
      std::thread thread2(increment_and_print);
    
      thread1.join();
      thread2.join();
    }
     1 #include <iostream>
     2 #include <mutex>
     3 #include <shared_mutex>
     4 #include <thread>
     5  
     6 class ThreadSafeCounter {
     7  public:
     8   ThreadSafeCounter() = default;
     9  
    10   unsigned int get() const {
    11     std::shared_lock lock(mutex_);
    12     return value_;
    13   }
    14  
    15   unsigned int increment() {
    16     std::unique_lock lock(mutex_);
    17     return ++value_;
    18   }
    19  
    20   void reset() {
    21     std::unique_lock lock(mutex_);
    22     value_ = 0;
    23   }
    24  
    25  private:
    26   mutable std::shared_mutex mutex_;
    27   unsigned int value_ = 0;
    28 };
    29  
    30 int main() {
    31   ThreadSafeCounter counter;
    32  
    33   auto increment_and_print = [&counter]() {
    34     for (int i = 0; i < 3; i++) {
    35       std::cout << std::this_thread::get_id() << "-" << counter.increment() << std::endl;
    36     }
    37   };
    38  
    39   std::thread thread1(increment_and_print);
    40   std::thread thread2(increment_and_print);
    41  
    42   thread1.join();
    43   thread2.join();
    44 }

    输出:

    2. 测试用例

     1 #include <iostream>
     2 #include <mutex>
     3 #include <shared_mutex>
     4 #include <thread>
     5 
     6 std::shared_mutex g_mutex;
     7 std::string g_str;
     8 
     9 void readLoop() {
    10   while (true) {
    11     std::this_thread::sleep_for(chrono::milliseconds(100));
    12     g_mutex.lock_shared();
    13     std::cout << g_str;
    14     g_mutex.unlock_shared();
    15   }
    16 }
    17 
    18 void writeLoop() {
    19   int number = 0;
    20   while (true) {
    21     stgd::this_thread::sleep_for(chrono::milliseconds(100));
    22     g_mutex.lock();
    23     g_str = to_string(number++) + "\n";
    24     g_mutex.unlock();
    25   }
    26 }
    27 
    28 int main() {
    29   std::thread t1(writeLoop);
    30   std::thread t2(readLoop);
    31   std::thread t3(readLoop);
    32 
    33   t1.join();
    34   t2.join();
    35   t3.join();
    36 }

    2)测试用例

  • 相关阅读:
    jsp简单自定义标签demo展示《二》
    jsp自定义标签介绍《一》
    登陆filter
    中文乱码原因以及解决方案
    C++ 中注意,零扩展和符号位扩展
    linux下的a.out文件
    今天谈谈流,什么是IO流?
    windows下的c语言和linux 下的c语言以及C标准库和系统API
    一维数组的数组指针
    结构体指针传参与返回值
  • 原文地址:https://www.cnblogs.com/sunbines/p/16153021.html
Copyright © 2020-2023  润新知