c++编程---锁

一 互斥锁

备注: 互斥锁详细应用请参考下面博客:
https://blog.csdn.net/WizardtoH/article/details/81452066

1 互斥量

(1) std::mutex

描述:最基本的Mutex

(2) std::recursive_mutex

名称:递归Mutex
描述:递归mutex类,能多次锁定而不死锁

(3) std::time_mutex

名称:定时Mutex
描述:定时mutex类,可以为了锁定而等待一定的时间

(4) std::recursive_timed_mutex

名称:定时递归Mutex

2 Lock 函数

(1) std::lock_guard

描述:与 Mutex RAII 相关,方便线程对互斥量上锁。

(2) std::unique_lock

描述:与 Mutex RAII 相关,方便线程对互斥量上锁,但提供了更好的上锁和解锁控制

(3) std::try_lock std::lock

描述: std::try_lock:尝试同时对多个互斥量上锁。
描述: std::lock:可以同时对多个互斥量上锁。

(4) std::call_once

描述: 如果多个线程需要同时调用某个函数,call_once可以保证多个线程对该函数只调用一次。

二 读写锁

#ifdef _MSC_VER
#include <process.h>
#include <windows.h>

class RWLock {
 public:
    RWLock() { InitializeSRWLock(&_rwlock); }
    ~RWLock() { }
    void rdlock()   { AcquireSRWLockShared(&_rwlock); }
    void rdunlock() { ReleaseSRWLockShared(&_rwlock); }
    void wrlock()   { AcquireSRWLockExclusive(&_rwlock); }
    void wrunlock() { ReleaseSRWLockExclusive(&_rwlock); }
 private:
    SRWLOCK _rwlock;
};
#else
#include <pthread.h>

class RWLock{
 public:
    RWLock() { pthread_rwlock_init(&_rwlock, NULL); }
    ~RWLock() { pthread_rwlock_destroy(&_rwlock); }
    void rdlock()   { pthread_rwlock_rdlock(&_rwlock); }
    void rdunlock() { pthread_rwlock_unlock(&_rwlock); }
    void wrlock()   { pthread_rwlock_wrlock(&_rwlock); }
    void wrunlock() { pthread_rwlock_unlock(&_rwlock); }
 private:
    pthread_rwlock_t _rwlock;
};
#endif

三 其他

备注: 如果未采用c++11 可以用下面跨平台互斥锁

#ifdef _MSC_VER
#include <windows.h>
#else
#include <pthread.h>
#endif //_MSC_VER
class IMyLock
{
public:
 virtual ~IMyLock() {}
 virtual void Lock() = 0;
 virtual void Unlock() = 0;
};
class XLock
{
public:
    XLock(IMyLock* plock)
 {
        m_lock = plock;
  m_lock->Lock();
 }
 ~XLock()
 {
  m_lock->Unlock();
  m_lock = NULL;
 }
private:
    IMyLock* m_lock;
};
#ifdef _MSC_VER
class XMutex : public IMyLock
{
public:
 XMutex()
 {
  m_mutex = ::CreateMutex(NULL, FALSE, NULL); 
 }
 ~XMutex()
 {
  ::CloseHandle(m_mutex); 
 }
 virtual void Lock()
 {
  WaitForSingleObject(m_mutex, INFINITE); 
 }
 virtual void Unlock()
 {
  ::ReleaseMutex(m_mutex);
 }
private:
 HANDLE m_mutex;
};
#else 
class XMutex : public IMyLock
{
public:
 XMutex()
 {
  pthread_mutexattr_t mattr;
  pthread_mutexattr_init( &mattr );
  pthread_mutex_init( &m_mutex, &mattr );
 }
 ~XMutex()
 {
  pthread_mutex_destroy( &m_mutex );
 }
 virtual void Lock()
 {
  pthread_mutex_lock( &m_mutex );
 }
 virtual void Unlock()
 {
  pthread_mutex_unlock( &m_mutex );
 }
private:
 pthread_mutex_t m_mutex;
};
#endif //#ifdef _MSC_VER
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值