#include<windows.h>
#include<iostream.h>DWORD WINAPI fun1Proc(LPVOID lpParameter);
DWORD WINAPI fun2Proc(LPVOID lpParameter);
//int index=0;
int tickets=100;
HANDLE Mutex;
void main()
{
HANDLE thread1=CreateThread(NULL,0,fun1Proc,0,0,NULL);
HANDLE thread2=CreateThread(NULL,0,fun2Proc,0,0,NULL);
CloseHandle(thread1);
CloseHandle(thread2);
/*while(index++<=1000)
cout<<"Main thread is running..."<<endl;*/
//Mutex=CreateMutex(NULL,FALSE,NULL);
Mutex=CreateMutex(NULL,FALSE,"selling tickets");
/*if(Mutex)
if(ERROR_ALREADY_EXISTS==GetLastError())
return;*/
Sleep(4000);
}DWORD WINAPI fun1Proc(LPVOID lpParameter)
{
/*while(index++<=1000)
cout<<"Thread1 is running..."<<endl;*/
while(TRUE)
{
WaitForSingleObject(Mutex,INFINITE);
if(tickets>0)
{
Sleep(1);
cout<<"Thread1 sells tickets"<<tickets--<<endl;
}
else
break;
ReleaseMutex(Mutex);
}
return 0;
}
DWORD WINAPI fun2Proc(LPVOID lpParameter)
{
/*while(index++<=1000)
cout<<"Thread1 is running..."<<endl;*/
while(TRUE)
{
WaitForSingleObject(Mutex,INFINITE);
if(tickets>0)
{
Sleep(1);
cout<<"Thread2 sells tickets"<<tickets--<<endl;
}
else
break;
ReleaseMutex(Mutex);
}
return 0;
}
这样一个简单的程序为何运行结果不正确呢?
运行结果
Thread1 sells tickets100
Thread2 sells tickets100
Thread1 sells tickets100
Thread2 sells tickets98
Thread1 sells tickets97
Thread2 sells tickets96
Thread1 sells tickets95
Thread2 sells tickets94
Thread1 sells tickets93
Thread2 sells tickets92
Thread1 sells tickets91
Thread2 sells tickets90
Thread1 sells tickets89
Thread2 sells tickets88
Thread1 sells tickets87
Thread2 sells tickets86
Thread1 sells tickets85
Thread2 sells tickets84
Thread1 sells tickets83
Thread2 sells tickets82
Thread1 sells tickets81
Thread2 sells tickets80
Thread1 sells tickets79
Thread2 sells tickets78
Thread1 sells tickets77
Thread2 sells tickets76
Thread1 sells tickets75
Thread2 sells tickets74
Thread1 sells tickets73
Thread2 sells tickets72
Thread1 sells tickets71
Thread2 sells tickets70
Thread1 sells tickets69
Thread2 sells tickets68
Thread1 sells tickets67
Thread2 sells tickets66
Thread1 sells tickets65
Thread2 sells tickets64
Thread1 sells tickets63
Thread2 sells tickets62
Thread1 sells tickets61
Thread2 sells tickets60
Thread1 sells tickets59
Thread2 sells tickets58
Thread1 sells tickets57
Thread2 sells tickets56
Thread1 sells tickets55
Thread2 sells tickets54
Thread1 sells tickets53
Thread2 sells tickets52
Thread1 sells tickets51
Thread2 sells tickets50
Thread1 sells tickets49
Thread2 sells tickets48
Thread1 sells tickets47
Thread2 sells tickets46
Thread1 sells tickets45
Thread2 sells tickets44
Thread1 sells tickets43
Thread2 sells tickets42
Thread1 sells tickets41
Thread2 sells tickets40
Thread1 sells tickets39
Thread2 sells tickets38
Thread1 sells tickets37
Thread2 sells tickets36
Thread1 sells tickets35
Thread2 sells tickets34
Thread1 sells tickets33
Thread2 sells tickets32
Thread1 sells tickets31
Thread2 sells tickets30
Thread1 sells tickets29
Thread2 sells tickets28
Thread1 sells tickets27
Thread2 sells tickets26
Thread1 sells tickets25
Thread2 sells tickets24
Thread1 sells tickets23
Thread2 sells tickets22
Thread1 sells tickets21
Thread2 sells tickets20
Thread1 sells tickets19
Thread2 sells tickets18
Thread1 sells tickets17
Thread2 sells tickets16
Thread1 sells tickets15
Thread2 sells tickets14
Thread1 sells tickets13
Thread2 sells tickets12
Thread1 sells tickets11
Thread2 sells tickets10
Thread1 sells tickets9
Thread2 sells tickets8
Thread1 sells tickets7
Thread2 sells tickets6
Thread1 sells tickets5
Thread2 sells tickets4
Thread1 sells tickets3
Thread2 sells tickets2
Thread1 sells tickets1
Press any key to continue

解决方案 »

  1.   

    这个问题每个月都会来那么一次
    把Mutex=CreateMutex(NULL,FALSE,"selling tickets");放到创建线程前面去
      

  2.   

    if(tickets>0)
     {
     Sleep(1);
     cout<<"Thread2 sells tickets"<<tickets--<<endl;
     }
     else
     break;
     ReleaseMutex(Mutex);
    执行 break以后还会执行ReleaseMutex(Mutex);吗?????DWORD WINAPI fun1Proc(LPVOID lpParameter)
     {
    int curticket=100;
     /*while(index++<=1000)
     cout<<"Thread1 is running..."<<endl;*/
     while(curticket>0 )
     {
       WaitForSingleObject(Mutex,INFINITE);
        curticket=tickets;
        if(curticket>0 ){
         Sleep(1);
         cout<<"Thread1 sells tickets"<<tickets--<<endl;
         }
         ReleaseMutex(Mutex);
     }
     return 0;
     }
     DWORD WINAPI fun2Proc(LPVOID lpParameter)
     {
    int curticket=100;
     /*while(index++<=1000)
     cout<<"Thread1 is running..."<<endl;*/
     while(curticket>0 )
     {
       WaitForSingleObject(Mutex,INFINITE);
        curticket=tickets;//这才是同步要干的事情,获取或者修改资源。
        if(curticket>0 ){
         Sleep(1);
         cout<<"Thread2 sells tickets"<<tickets--<<endl;
         }
         ReleaseMutex(Mutex);
     }
     }