多线程 疑问
各位高手帮我看一下以下代码(参考孙鑫的视频写的)我没分了,好心人就指点一下吧
#include <iostream.h>
#include <windows.h>
DWORD WINAPI ThreadProc_1(LPVOID lpParameter);
DWORD WINAPI ThreadProc_2(LPVOID lpParameter);
int tickets = 100;
HANDLE hMutex;
int main()
{
HANDLE hThread1;
HANDLE hThread2;
hThread1 = CreateThread(NULL,0,ThreadProc_1,NULL,0,NULL);
hThread2 = CreateThread(NULL,0,ThreadProc_2,NULL,0,NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
hMutex = CreateMutex(NULL,FALSE,NULL);
Sleep(4000);
return 0;
}
DWORD WINAPI ThreadProc_1(LPVOID lpParameter)
{
DWORD result1;
while(TRUE)
{
result1 = WaitForSingleObject(hMutex,INFINITE);
if(tickets /*&& result1 != WAIT_FAILED*/)
{
cout<<"Thread1 sells ticket:"<<tickets--<<endl;
}
else
{
break;
}
ReleaseMutex(hMutex);
}
return 0;
}
DWORD WINAPI ThreadProc_2(LPVOID lpParameter)
{
DWORD result2;
while(TRUE)
{
result2 = WaitForSingleObject(hMutex,INFINITE);
if(tickets/* && result2 != WAIT_FAILED*/)
{
cout<<"Thread2 sells ticket:"<<tickets--<<endl;
}
else
{
break;
}
ReleaseMutex(hMutex);
}
return 0;
}
我查了一下WaitForSingleObject()的第二个参数为INFINITE,当hMutex为非信号态时,线程应挂起,而不会执行下面的代码,但是我发现程序还是往下执行,我加了if(tickets && result2 != WAIT_FAILED)后好了,不加之前,有时会出现以下结果:
Thread1 sells ticket:100
Thread1 sells ticket:100
Thread2 sells ticket:99
Thread1 sells ticket:98
Thread2 sells ticket:97
Thread1 sells ticket:96
Thread2 sells ticket:95
Thread1 sells ticket:94
Thread2 sells ticket:93
Thread2 sells ticket:92
Thread2 sells ticket:91
Thread2 sells ticket:90
Thread2 sells ticket:89
Thread1 sells ticket:88
Thread2 sells ticket:87
Thread1 sells ticket:86
Thread2 sells ticket:85
Thread1 sells ticket:84
Thread2 sells ticket:83
Thread1 sells ticket:82
Thread2 sells ticket:81
Thread1 sells ticket:80
Thread2 sells ticket:79
Thread1 sells ticket:78
Thread2 sells ticket:77
Thread1 sells ticket:76
Thread2 sells ticket:75
Thread1 sells ticket:74
Thread2 sells ticket:73
Thread1 sells ticket:72
Thread2 sells ticket:71
Thread1 sells ticket:70
Thread2 sells ticket:69
Thread1 sells ticket:68
Thread2 sells ticket:67
Thread1 sells ticket:66
Thread2 sells ticket:65
Thread1 sells ticket:64
Thread2 sells ticket:63
Thread1 sells ticket:62
Thread2 sells ticket:61
Thread1 sells ticket:60
Thread2 sells ticket:59
Thread1 sells ticket:58
Thread2 sells ticket:57
Thread1 sells ticket:56
Thread2 sells ticket:55
Thread1 sells ticket:54
Thread1 sells ticket:53
Thread2 sells ticket:52
Thread1 sells ticket:51
Thread2 sells ticket:50
Thread1 sells ticket:49
Thread2 sells ticket:48
Thread1 sells ticket:47
Thread2 sells ticket:46
Thread1 sells ticket:45
Thread2 sells ticket:44
Thread1 sells ticket:43
Thread2 sells ticket:42
Thread1 sells ticket:41
Thread2 sells ticket:40
Thread1 sells ticket:39
Thread2 sells ticket:38
Thread1 sells ticket:37
Thread2 sells ticket:36
Thread1 sells ticket:35
Thread2 sells ticket:34
Thread1 sells ticket:33
Thread2 sells ticket:32
Thread1 sells ticket:31
Thread2 sells ticket:30
Thread1 sells ticket:29
Thread2 sells ticket:28
Thread1 sells ticket:27
Thread2 sells ticket:26
Thread1 sells ticket:25
Thread2 sells ticket:24
Thread1 sells ticket:23
Thread2 sells ticket:22
Thread1 sells ticket:21
Thread2 sells ticket:20
Thread1 sells ticket:19
Thread2 sells ticket:18
Thread1 sells ticket:17
Thread2 sells ticket:16
Thread1 sells ticket:15
Thread2 sells ticket:14
Thread1 sells ticket:13
Thread2 sells ticket:12
Thread1 sells ticket:11
Thread2 sells ticket:10
Thread1 sells ticket:9
Thread2 sells ticket:8
Thread1 sells ticket:7
Thread2 sells ticket:6
Thread1 sells ticket:5
Thread2 sells ticket:4
Thread1 sells ticket:3
Thread2 sells ticket:2
Thread1 sells ticket:1
Press any key to continue
发现有问题,想请大家帮忙指点一下啊。