对于线程互斥的实现:Windows有互斥体和临界区两个方法,Linux有pthread库的互斥锁。Windows线程同步一般使用临界区。
这里主要讨论Windows临界区与Linux互斥锁的区别。
Windows:同一线程可以重复进入同一临界区(当然也要多次离开),而线程不被系统阻塞。
Linux:同一线程不能重复进入同一临界区。否则线程被阻塞。
下面是我写的一个Windows/Linux通用线程互斥类
################### llock.h #####################
/********************************************************************
创建日期: 2004/09/02
文件名称: llock.h
作者: 刘磊(vietor)
版本: 1.0
创建目的:
Windows/Linux通用线程互斥锁类。注意以下两点:
Windows:同一线程可以重复进入同一互斥(当然也要多次离开),而线程不被系统阻塞。
Linux:同一线程不能重复进入同一临界区。否则线程被阻塞。
版权声明:
您可以随意拷贝和使用这个程序的副本,但请保证所有文件的完整和
不被修改,如果您有修改意见,请与作者联系。
*********************************************************************/
#ifndef _LLOCK_
#define _LLOCK_
#ifdef _WIN32
#include <windows.h>
#else
#include <pthread.h>
#endif
//互斥锁类
class llock
{
public:
inline llock(void)
{
m_bInit=true;
#ifdef _WIN32
::InitializeCriticalSection(&m_lock);
#else
::pthread_mutex_init(&m_lock,NULL);
#endif
}
inline ~llock(void)
{
if(m_bInit)
{
m_bInit=false;
#ifdef _WIN32
::DeleteCriticalSection(&m_lock);
#else
::pthread_mutex_destroy(&m_lock);
#endif
}
}
//锁定(进入互斥锁)
inline void lock(void)
{
if(m_bInit)
{
#ifdef _WIN32
::EnterCriticalSection(&m_lock);
#else
::pthread_mutex_lock(&m_lock);
#endif
}
}
//解锁(离开互斥锁)
inline void unlock(void)
{
if(m_bInit)
{
#ifdef _WIN32
::LeaveCriticalSection(&m_lock);
#else
::pthread_mutex_unlock(&m_lock);
#endif
}
}
private:
bool volatile m_bInit;
#ifdef _WIN32
CRITICAL_SECTION m_lock;
#else
pthread_mutex_t m_lock;
#endif
};
//自动锁定类(内联方式使用)
class lautolock{
public:
inline lautolock(llock& lock):m_lock(lock)
{
m_lock.lock();
}
inline ~lautolock()
{
m_lock.unlock();
}
private:
llock& m_lock;
};
#endif