多线程同步锁

#pragma once

/************************************************************************/
/* Some objects kind of objects should not be copied. This is particularly true
/* of objects involved in providing mutually exclusive access to something                                                                     */
/************************************************************************/
class NonCopyable {

//! Restrict the copy constructor
NonCopyable(const NonCopyable&);

//! Restrict the assignment operator
const NonCopyable& operator=(const NonCopyable&);

protected:

//! Create a NonCopyable object
NonCopyable() { }

//! Destroy a NonCopyable object
~NonCopyable() { }

};


#pragma once

#include "NonCopyable.h"
#include <winbase.h>

//锁接口
class ILock 
{ 
public: 
virtual ~ILock() {} 
virtual void Lock() = 0; 
virtual void Unlock() = 0; 
}; 

/************************************************************************/
/*        CRITICAL_SECTION                                              */
/************************************************************************/
class CriticalSectionLocker 
: public ILock, private NonCopyable
{  
public: 
inline CriticalSectionLocker(void)
{
InitializeCriticalSectionAndSpinCount(&m_hCriticalSection, 4000); //增加旋转次数
}

inline virtual ~CriticalSectionLocker(void)
{
DeleteCriticalSection(&m_hCriticalSection); 
}

inline virtual void Lock()
{
EnterCriticalSection(&m_hCriticalSection);
}

inline virtual void Unlock()
{
LeaveCriticalSection(&m_hCriticalSection); 
}
private:
CRITICAL_SECTION m_hCriticalSection;
}; 

/************************************************************************/
/* Mutex                                                                */
/************************************************************************/
//互斥对象锁类 

class MutexLocker
: public ILock , private NonCopyable
{ 
public: 
MutexLocker()
{
m_mutex = ::CreateMutex(NULL, FALSE, NULL); 
}

~MutexLocker()
{
if(m_mutex == NULL)
return;
::CloseHandle(m_mutex);
m_mutex=NULL;
}

inline virtual void Lock()
{
if(m_mutex == NULL)
return;
DWORD d = WaitForSingleObject(m_mutex, INFINITE);
}

inline virtual void Unlock()
{
if(m_mutex == NULL)
return;
::ReleaseMutex(m_mutex);
}

private: 
HANDLE m_mutex; 
}; 

/************************************************************************/
/* 信号量                                                                */
/************************************************************************/

class SemaphoreLocker
: public ILock , private NonCopyable
{
private:
HANDLE m_handle;

public:
SemaphoreLocker(): m_handle(NULL)
{
m_handle = CreateSemaphore(NULL, 0, 1, NULL);
}

~SemaphoreLocker()
{ 
if(m_handle == NULL)
return;
int ret = CloseHandle(m_handle);
m_handle = NULL;
}

inline virtual void Lock()
{
if(m_handle == NULL)
return;
DWORD ret = WaitForSingleObject(m_handle, INFINITE);
//return (WAIT_OBJECT_0 == ret) ? true : false;
}

inline virtual void Unlock()
{
if(m_handle == NULL)
return;
ReleaseSemaphore(m_handle, 1, NULL);
}

};

/************************************************************************/
/* 自动锁                                                                     */
/************************************************************************/
template <typename LockTyp>
class AutoLock : private NonCopyable
{ 
LockTyp* m_pLock; 
public: 
AutoLock(LockTyp& locker) 
{ 
m_pLock = &locker; 
m_pLock->Lock(); 
} 

AutoLock(LockTyp* locker) 
{ 
m_pLock = locker; 
m_pLock->Lock(); 
} 

~AutoLock(void) 
{ 
m_pLock->Unlock(); 
} 
}; 


应用实例:

下面是对一个函数进行加锁

CString DoSomething( CString str )
{
    AutoLock<CriticalSectionLocker> autoLock(_lockPageParse);
    ......
}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
同步锁在Java多线程中用于保护共享资源,以确保同一时间只有一个线程可以访问该资源,从而避免数据竞争和并发问题。在Java中,可以使用synchronized关键字来实现同步锁的机制。 对于非静态的同步方法,锁可以是this对象或其他对象,要求是同一个对象。例如,使用关键字synchronized修饰的sell()方法,锁就在this对象上。 对于静态的同步方法,锁是当前类本身。因为静态方法可以在没有实例化对象的情况下使用,所以只能使用类来作为锁。可以使用synchronized修饰的静态方法m1()和m2()是示例。 除了直接在方法上使用synchronized关键字,还可以使用同步代码块来实现锁的机制。同步代码块的锁对象可以是this对象或其他对象。 当一个线程持有锁时,其他线程将无法获得该锁,它们将被阻塞,直到持有锁的线程释放锁。锁的释放可以通过以下方式实现: 1. 当前线程的同步方法或同步代码块执行结束。 2. 当前线程在同步代码块或同步方法中遇到break或return语句。 3. 当前线程在同步代码块或同步方法中出现未处理的Error或Exception,导致异常结束。 4. 当前线程在同步代码块或同步方法中执行了线程对象的wait()方法,暂停当前线程,并释放锁。 需要注意的是,线程执行同步代码块或同步方法时,调用Thread.sleep()或Thread.yield()方法暂停当前线程的执行不会释放锁。此外,使用suspend()方法将线程挂起也不会释放锁。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值