zoukankan      html  css  js  c++  java
  • C++之MutexLock和MutexLockGuard封装

    noncopyable.h

    #ifndef NONCOPYABLE_H
    #define NONCOPYABLE_H
    
    namespace muduo
    {
    
    class noncopyable
    {
     public:
      noncopyable(const noncopyable&) = delete;
      void operator=(const noncopyable&) = delete;
    
     protected:
      noncopyable() = default;
      ~noncopyable() = default;
    };
    
    }  // namespace muduo
     
    #endif
    
    

    mutexLockGuard.h

    #ifndef MUTEXLOCKGUARD_H
    #define MUTEXLOCKGUARD_H
    
    #include "noncopyable.h"
    #include <pthread.h>
    namespace muduo {
    
    class MutexLock : public muduo::noncopyable //表达语义
    {
    public:
      MutexLock() { pthread_mutex_init(&_mutex, NULL); }
    
      ~MutexLock() { pthread_mutex_destroy(&_mutex); }
    
      void lock() { pthread_mutex_lock(&_mutex); }
    
      void unlock() { pthread_mutex_unlock(&_mutex); }
    
      pthread_mutex_t *getMutexLockPtr() { return &_mutex; }
    
    private:
      pthread_mutex_t _mutex;
    };
    
    // RAII
    class MutexLockGuard {
    public:
      MutexLockGuard(MutexLock &mutex) : mutexLock_(mutex) { mutexLock_.lock(); }
    
      ~MutexLockGuard() { mutexLock_.unlock(); }
    
    private:
      MutexLock &mutexLock_;
    };
    
    } // namespace muduo
    
    #endif
    

    test.cc

    #include "mutexLockGuard.h"
    #include <iostream> // std::cout
    #include <thread>   // std::thread
    #include <vector>   // std::vector
    using namespace muduo;
    
    class Counter : muduo::noncopyable {
    public:
      Counter() : value_(0) {}
      int value() const;
      int getAndIncrease();
    
    private:
      int value_;
      mutable MutexLock mutex_;
    };
    
    int Counter::value() const {
      MutexLockGuard lock(mutex_);
      return value_;
    }
    int Counter::getAndIncrease() {
      MutexLockGuard lock(mutex_);
      int ret = value_++;
      return ret;
    }
    
    void increase_global(Counter &cnt, int n) {
      for (int i = 0; i < n; ++i)
        cnt.getAndIncrease();
    }
    int main() {
      Counter cnt;
      std::vector<std::thread> threads;
    
      std::cout << "increase global counter with 10 threads...
    ";
      for (int i = 1; i <= 10; ++i)
        threads.push_back(std::thread(increase_global, std::ref(cnt), 100));
      std::cout << "synchronizing all threads...
    ";
      for (auto &th : threads)
        th.join();
    
      std::cout << "global_counter: " << cnt.value() << '
    ';
      return 0;
    }
    
    
  • 相关阅读:
    对于高并发短连接造成Cannot assign requested address解决方法
    virtualbox迁移已建虚机存储磁盘方法
    httpd:RSA certificate configured for SERVER does NOT include an ID which matches the server name
    解决服务不断重启挂掉问题
    tbb静态库编译
    su和su
    ubuntu18.04 mariadb start失败
    如何修复“sshd error: could not load host key”
    [LeetCode]Gas Station
    Java多态的一些陷阱
  • 原文地址:https://www.cnblogs.com/ims-/p/13763612.html
Copyright © 2011-2022 走看看