HANDLE WINAPI CreateSemaphore(
  __in          LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
  __in          LONG lInitialCount, //0
  __in          LONG lMaximumCount, //0
  __in          LPCTSTR lpName
);
//然后,下面这个函数调用失败?
BOOL WINAPI ReleaseSemaphore(
  __in          HANDLE hSemaphore,
  __in          LONG lReleaseCount,//1
  __out         LPLONG lpPreviousCount
);//如何wait ?再看一份源代码里面看到,不知道这样设计有何意义?这个信号不是怎么都不触发了么?

解决方案 »

  1.   

    如果都是0 ,你的CreateSemaphore 应该是返回NULL 失败的
      

  2.   

    也就是semaphore对象创建失败?
    是别人设计一个线程池函数。
    里面的semaphore对象是用来同步线程数目。
      

  3.   

    Semaphore对象是用于控制并发的线程数量的,
    CreateSemaphore中的参数lInitialCount表示,信标对象初始化时的信号的计数,
    参数lMaximumCount中表示,信标对象信号的最大计数,也就是这个信标最多允许几个线程来使用它。当一个信标的信号计数大于0时,它就是信号态。否则,它就是非信号态的。如果信标处于信号态的,那么一个线程中对信标使用WaitForSingleObject,返回立刻返回,此时信标的信号计数会减1,当线程对信标使用ReleaseSemaphore时,信标的信号计数会加1.当Semaphore对象的信号计数为n时,这意味着,前n个线程对信标使用WaitForsingleObject,就会立刻返回,但是第n+1个线程对信标再次使用WaitForsingleObject时,就会被挂起。因为当第n+1个线程启动时,信标已经处于非信号态了。