Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2315950
  • 博文数量: 473
  • 博客积分: 12252
  • 博客等级: 上将
  • 技术积分: 4307
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-12 10:02
文章分类

全部博文(473)

文章存档

2012年(8)

2011年(63)

2010年(73)

2009年(231)

2008年(98)

分类:

2008-12-08 15:05:10

对于线程互斥的实现: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
  #else
  #include
  #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
阅读(1688) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~