一个轻量级的信号量

一个轻量级的信号量

评论请移步:http://zbm.xuanwo.tk/2011/03/slim-semaphore.html

基于SRWLOCK和条件变量(Condition Variable)实现,需要windows vista及以上操作系统,编译时_WIN32_WINNT要大于0x0600。基本功能和用CreateSemaphore创建出来的差不多,不过不支持跨进程使用,也模拟不了WaitForMultipleObjects的情形。和系统自带的那个相比一般会快一点,具体结果取决于硬件,有些机器上能快十几倍,有些机器则只稍快一丁点。请注意我说的快十几倍也仅仅是指这两个实现本身的差别,而不是说程序的总体性能提高这么多。具体是否使用,大家可以根据自己的测试结果来决定。代码和使用应该都很简单,就不多解释和举例了。

 1  class  CSlimSemaphore
 2  {
 3  private :
 4      SRWLOCK m_lock;
 5      CONDITION_VARIABLE m_cv;
 6      LONG m_value;
 7      LONG m_maximum;
 8 
 9  public :
10      CSlimSemaphore( LONG lInitialCount, LONG lMaximumCount )
11      {
12          InitializeSRWLock(  & m_lock );
13          InitializeConditionVariable(  & m_cv );
14          m_value  =  lInitialCount;
15          m_maximum  =  lMaximumCount;
16      }
17 
18       ~ CSlimSemaphore() { }
19 
20      BOOL Release( LONG lReleaseCount, LONG *  lpPreviousCount )
21      {
22          BOOL succeeded  =  FALSE;
23 
24          AcquireSRWLockExclusive(  & m_lock );
25 
26           if ( m_value  +  lReleaseCount  & lt; =  m_maximum )
27          {
28               if ( lpPreviousCount  !=  NULL )
29                   * lpPreviousCount  =  m_value;
30              m_value  +=  lReleaseCount;
31              succeeded  =  TRUE;
32          }
33 
34          ReleaseSRWLockExclusive(  & m_lock );
35 
36           if ( succeeded )
37              WakeAllConditionVariable(  & m_cv );
38           else
39              SetLastError( ERROR_TOO_MANY_POSTS );
40 
41           return  succeeded;
42      }
43 
44      DWORD Wait( DWORD dwTimeout )
45      {
46          DWORD result  =  WAIT_TIMEOUT;
47          DWORD start  =  GetTickCount();
48 
49          AcquireSRWLockExclusive(  & m_lock );
50 
51           while true  )
52          {
53               if ( m_value  & gt;  0  )
54              {
55                   -- m_value;
56                  result  =  WAIT_OBJECT_0;
57                   break ;
58              }
59 
60               if ( dwTimeout  !=  INFINITE )
61              {
62                  DWORD end  =  GetTickCount();
63                   if ( end  -  start  & gt; =  dwTimeout )
64                       break ;
65                  dwTimeout  -=  end  -  start;
66                  start  =  end;
67              }
68 
69               if ! SleepConditionVariableSRW(  & m_cv,  & m_lock, dwTimeout,  0  ) )
70              {
71                   if ( GetLastError()  !=  ERROR_TIMEOUT )
72                      result  =  WAIT_FAILED;
73                   break ;
74              }
75          }
76 
77          ReleaseSRWLockExclusive(  & m_lock );
78 
79           return  result;
80      }
81  };

你可能感兴趣的:(一个轻量级的信号量)