15,473
社区成员




老帖子没有搞懂,关于WaitforSingleObject
waitforsingleObject(句柄,-1); 表示 当 句柄所指的东东有信号的时候,才会返回。。。。。
这句话是来自windows核心编程上的。 这里的句柄是表示线程内核。不是Event.
fun1Proc的代码可以看出,首先进入临界区,然后开始执行。。。。
fun2Proc同理。
但是事实上,线程根本没有运行!! 没有打印任何结果。 不少网友认为之所以没有执行线程,
是因为CloseHandle和WaitforSingleObject顺序反了,颠倒过来,就可以了。。。
别忘了,CreateThread 后,线程的内核对象是2,不是1,所以可以创建后,就CloseHandle.
所以 颠倒顺序,没有说到点上。
int tickets = 100;
CRITICAL_SECTION criSection;
int main()
{
HANDLE hThread2;
HANDLE hThread1;
InitializeCriticalSection(&criSection);
hThread1 = CreateThread(NULL,0,Fun1Proc1,NULL,0,NULL);
hThread2 = CreateThread(NULL,0,Fun1Proc2,NULL,0,NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
WaitForSingleObject(hThread1,-1);
WaitForSingleObject(hThread2,-1);
DeleteCriticalSection(&criSection);
return 0 ;
}
DWORD WINAPI Fun1Proc1(
LPVOID lpParameter // thread data
)
{
while(TRUE)
{
EnterCriticalSection(&criSection);
if(tickets>0)
{
Sleep(1);
cout<<"thread1 sell ticket : "<<tickets--<<endl;
}
else{
LeaveCriticalSection(&criSection);
break;
}
LeaveCriticalSection(&criSection);
}
return 0;
}
DWORD WINAPI Fun1Proc2(
LPVOID lpParameter // thread data
)
{
while(TRUE)
{
EnterCriticalSection(&criSection);
if(tickets>0)
{
Sleep(1);
cout<<"thread2 sell ticket : "<<tickets--<<endl;
}
else {
LeaveCriticalSection(&criSection);
break;
}
LeaveCriticalSection(&criSection);
}
return 0;
}