對於線程互斥的實現:Windows有互斥體和臨界區兩個方法,Linux有pthread庫的互斥鎖。Windows線程同步一般使用臨界區。
這裡主要討論Windows臨界區與Linux互斥鎖的區別。
Windows:同一線程可以重複進入同一臨界區(當然也要多次離開),而線程不被系統阻塞。
Linux:同一線程不能重複進入同一臨界區。否則線程被阻塞。
下面是我寫的一個Windows/Linux通用線程互斥類
################### llock.h #####################
/********************************************************************
建立日期: 2004/09/02
檔案名稱: llock.h
作者: 劉磊(vietor)
版本: 1.0
郵箱: liuleilover@163.com
建立目的:
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