Y
ygyu
Unregistered / Unconfirmed
GUEST, unregistred user!
描述:
1:首先创建初始计数为0的Semaphore
hSem = CreateSemaphore(NULL, 0, 10, NULL);
2:启动线程等待该信号灯被释放
BeginThread(ThreadPorc, 0);
UINT ThreadProc(LPVOID pParam)
{
WaitForSingleObject(hSem, INFINITE);
}
3:ThreadProc线程启动后,在主线程中通过释放信号灯来结束该线程,
ReleaseSemaphore(hSem, 1, &nPrevCount)
4:紧跟着再次调用ReleaseSemaphore获得信号灯的计数值
ReleaseSemaphore(hSem, 1, &nPrevCount)
此时返回的信号灯应当为0,因为第一次调用
ReleaseSemaphore的时候有一个线程阻塞在该信号灯上,因而不会引起计数值的加一.
但是当使用Delphi4.0调试的时候,并且在第二个ReleaseSemaphore设置断点,则返回的计数值必定为1.
另外如果我们使用VC6.0(代码类似),如果断点在第二个ReleaseSemaphore处停留一会儿,然后单步运行该语句,则返回的计数值有时为1.
1:首先创建初始计数为0的Semaphore
hSem = CreateSemaphore(NULL, 0, 10, NULL);
2:启动线程等待该信号灯被释放
BeginThread(ThreadPorc, 0);
UINT ThreadProc(LPVOID pParam)
{
WaitForSingleObject(hSem, INFINITE);
}
3:ThreadProc线程启动后,在主线程中通过释放信号灯来结束该线程,
ReleaseSemaphore(hSem, 1, &nPrevCount)
4:紧跟着再次调用ReleaseSemaphore获得信号灯的计数值
ReleaseSemaphore(hSem, 1, &nPrevCount)
此时返回的信号灯应当为0,因为第一次调用
ReleaseSemaphore的时候有一个线程阻塞在该信号灯上,因而不会引起计数值的加一.
但是当使用Delphi4.0调试的时候,并且在第二个ReleaseSemaphore设置断点,则返回的计数值必定为1.
另外如果我们使用VC6.0(代码类似),如果断点在第二个ReleaseSemaphore处停留一会儿,然后单步运行该语句,则返回的计数值有时为1.