对于线程互斥的实现:Windows有互斥体和临界区两个方法,Linux有pthread库的互斥锁。Windows线程同步一般使用临界区。
这里主要讨论Windows临界区与Linux互斥锁的区别。
Windows:同一线程可以重复进入同一临界区(当然也要多次离开),而线程不被系统阻塞。
Linux:同一线程不能重复进入同一临界区。否则线程被阻塞。
下面是我写的一个Windows/Linux通用线程互斥类
################### llock.h #####################
/******************************************************************** 创建日期: 2004/09/02 文件名称: llock.h 作者: 刘磊(vietor) 版本: 1.0 邮箱: [email protected]
创建目的: 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

|