RAII手法封装互斥锁

RAII手法是 Resource Acquisition is Initialization 的缩写,意为“资源获取即初始化”,在使用智能指针时也使用,下面是针对互斥量时的实现,

 1 #include <iostream>
 2 #include <pthread.h>
 3
 4 using namespace std;
 5
 6 class MutexLock
 7 {
 8 public:
 9     MutexLock()
10     {
11         pthread_mutex_init(&mutex_, NULL);
12     }
13
14     ~MutexLock()
15     {
16         pthread_mutex_destroy(&mutex_);
17     }
18
19     void Lock()
20     {
21         pthread_mutex_lock(&mutex_);
22     }
23
24     void Unlock()
25     {
26         pthread_mutex_unlock(&mutex_);
27     }
28
29 private:
30     MutexLock(const MutexLock&);
31     MutexLock& operator=(const MutexLock&);
32     pthread_mutex_t mutex_;
33 };
34
35 class MutexLockGuard
36 {
37 public:
38     explicit MutexLockGuard(MutexLock& mutex): mutex_(mutex)
39     {
40         mutex_.Lock();
41     }
42
43     ~MutexLockGuard()
44     {
45         mutex_.Unlock();
46     }
47
48 private:
49     MutexLockGuard(const MutexLockGuard&);
50     MutexLockGuard& operator=(const MutexLockGuard&);
51
52     MutexLock& mutex_;
53 };
54
55 class Foo
56 {
57 public:
58     void print()
59     {
60         MutexLockGuard lock(mutex_);
61         cout << "Hello" << endl;
62     }
63
64 private:
65     MutexLock mutex_;
66 };
时间: 2024-11-08 01:50:48

RAII手法封装互斥锁的相关文章

RAII手法封装相互排斥锁

CriticalSectionWrapper是一个接口类 class CriticalSectionWrapper { public: // Factory method, constructor disabled static CriticalSectionWrapper* CreateCriticalSection(); virtual ~CriticalSectionWrapper() {} // Tries to grab lock, beginning of a critical se

C++ RAII手法实现的线程安全的日志文件写例子

#include <iostream> #include <fstream> #include <string> #include <cstdarg> #include <cstdio> #include <pthread.h> // MutexLock 封装互斥锁的接口 class MutexLock { public: MutexLock() { pthread_mutex_init(&mutex_, NULL); } M

Linux组件封装(一)中互斥锁MutexLock的封装

本文对Linux中的pthread_mutex_t做一个简易的封装. 互斥锁主要用于互斥,互斥是一种竞争关系,主要是某一个系统资源或一段代码,一次做多被一个线程访问. 条件变量主要用于同步,用于协调线程之间的关系,是一种合作关系. Linux中互斥锁的用法很简单,最常用的是以下的几个函数: int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr); int pthread_mutex_

Linux多线程的使用一:互斥锁

多线程经常会在Linux的开发中用到,我想把平时的使用和思考记录下来,一是给自己做个备忘,二是分享给可能会用到的人. POSIX标准下互斥锁是pthread_mutex_t,与之相关的函数有: 1 int pthread_mutex_init(pthread_mutex_t * mutex , pthread_mutexattr_t * attr); 2 int pthread_mutex_destroy (pthread_mutex_t * mutex); 3 int pthread_mute

悲观的并发策略——Synchronized互斥锁

volatile既然不足以保证数据同步,那么就必须要引入锁来确保.互斥锁是最常见的同步手段,在并发过程中,当多条线程对同一个共享数据竞争时,它保证共享数据同一时刻只能被一条线程使用,其他线程只有等到锁释放后才能重新进行竞争.对于java开发人员,我们最熟悉的肯定就是用synchronized关键词完成锁功能,在涉及到多线程并发时,对于一些变量,你应该会毫不犹豫地加上synchronized去保证变量的同步性. 在C/C++可直接使用操作系统提供的互斥锁实现同步和线程的阻塞和唤起,与之不同的是,j

ReactiveSwift源码解析(十一) Atomic的代码实现以及其中的Defer延迟、Posix互斥锁、递归锁

本篇博客我们来聊一下ReactiveSwift中的原子性操作,在此内容上我们简单的聊一下Posix互斥锁以及递归锁的概念以及使用场景.然后再聊一下Atomic的代码实现.Atomic主要负责多线程下的原子操作,负责共享资源的同步一致性.而在Atomic中就是使用到了Posix互斥锁和递归锁.在聊上述内容之前,我们先来回顾一下Swift语言中延迟执行defer的使用方式,在之前Swift编程的相关博客中也涉及到了defer的使用方式.defer因为Atomic使用到了延迟操作,所以下方我们再做一个

boost并发编程(一)——互斥锁

这个系列其实是<Boost程序库完全开发指南>的读书笔记.按照书中的方法代码没跑起来,所以转到Ubuntu下学习了.boost库在Ubuntu下的安装,直接用apt-get install命令安装就可以了,需要安装libboost-dev libboost-system libboost-thread 我们直接上代码,通过讲解代码来学习.一方面,更详细的内容请参看原书,在此不作重复:另一方面,先把代码跑起来比看了半天书连几行代码都运行不起来更能激励学习. #include <boost/

剖析curator的分布式互斥锁原理

1 前言 最近在做项目的时候,遇到一个多线程访问申请一个资源的问题.需要每个线程都能够最终在有效的时间内申请到或者超时失败.以前一般这种方式用的是redis做枷锁机制,每个线程都去redis加一把共同的锁,如果枷锁成功,则执行资源申请操作.而没有枷锁成功的线程,则在有效时间内循环尝试去枷锁,并且每次木有加锁成功,则就Thread.sleep()一会. 通过这种方式可以看出,这里对于sleep的时间间隔要求设置很严格,如果太小,则就会增加大规模的redis请求操作:而如果太长,当资源可用的时候,但

解决NSDistributedLock进程互斥锁的死锁问题(一)

在MAC下的多进程开发中,NSDistributedLock是一个非常方便的互斥锁解决方案,一般的使用方法: 12345678 NSDistributedLock *lock = [[NSDistributedLock alloc] initWithPath:@"/Users/mac/Desktop/lock.lock"];while (![lock tryLock]){ sleep(1);} //do something[lock unlock]; 但在实际使用过程中,当执行到do