各位大侠,请看下面代码:
int tickets=100;//定义全局变量tickets
void main()
{
HANDLE hThread1;
HANDLE hThread2;
hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);//创建线程1
hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);//创建线程2
hMutex=CreateMutex(NULL,TRUE,NULL);//创建互斥对象
Sleep(4000);}DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
while(TRUE)
{
WaitForSingleObject(hMutex,INFINITE);
if(tickets>0)
{
Sleep(1);
cout<<"thread1 sell ticket : "<<tickets--<<endl;
}
else
break;
ReleaseMutex(hMutex);
} return 0;
}DWORD WINAPI Fun2Proc(LPVOID lpParameter )
{
        while(TRUE)
{
WaitForSingleObject(hMutex,INFINITE);
if(tickets>0)
{
Sleep(1);
cout<<"thread2 sell ticket : "<<tickets--<<endl;
}
else
break;
ReleaseMutex(hMutex);
}
return 0;
}
结果是交替输出thread2 sell ticket : 100
            thread1 sell ticket : 99
            thread2 sell ticket : 98
            thread1 sell ticket : 97
我的问题是为什么两个线程能恰好交替执行呢?当线程1的执行函数ReleaseMutex(hMutex)后,hMutex变为有信号,但是两个线程都在WaitForSingleObject(hMutex,INFINITE)也就是说两线程都在争夺hMutex啊,为什么就能恰好一个释放后另一个线程恰好得到hMutex呢?补充问题,为什么是线程2先输出呢?明明是线程1先创建的啊,还有我把sleep(1)都注释掉后输出thread1 sell ticket : 100
                                      thread1 sell ticket : 99
后面是交替输出的,望指教!

解决方案 »

  1.   

    可能是你的这两个线程的优先级是一样的,但是假设第一次是第一个线程得到了CPU,此时第二个线程就会因为WaitForSingleObject(hMutex,INFINITE); 等待。当第一个线程到ReleaseMutex(hMutex); 时,第二个线程可能等了很久,操作系统会注意到这点的,所以这时两个线程同时申请资源时,它会先分配CPU给等待久一点的线程的。都是猜想。
      

  2.   

       二楼的大侠我觉得你猜想的很有道理,只是我们都不感确定啊,看来线程的轮询策略肯定是由操作系统自己决定的,如果不清楚到底是怎么样一个策略,就怕以后做大项目时会出bug