int ticket=100;
void main()
{  
int a=0;
  HANDLE hthread1=CreateThread(NULL,0,fun1Proc,NULL,0,NULL);
  HANDLE hthread2=CreateThread(NULL,0,fun2Proc,NULL,0,NULL);
  CloseHandle(hthread1);
  CloseHandle(hthread2);
  
 mutex=CreateMutex(NULL,FALSE,NULL);
 Sleep(4000);}DWORD WINAPI fun1Proc(
  LPVOID lpParameter   // thread data
)
{
while(1)
{
WaitForSingleObject(mutex,INFINITE);
if(ticket>0)
{   Sleep(1);
cout<<"thread1 sell ticket:"<<ticket--<<endl; } else
break;
ReleaseMutex(mutex);
}
 
return 0;
}
DWORD WINAPI fun2Proc(
  LPVOID lpParameter   // thread data
)
{

while(1)
{

WaitForSingleObject(mutex,INFINITE);
if(ticket>0)
{   
Sleep(1);
cout<<"thread2 sell ticket:"<<ticket--<<endl; } else
break;
ReleaseMutex(mutex);
}
 
return 0;
}
这是两个线程函数,如果这两个线程函数只是加上Sleep()使两个线程交替执行我明白.当实现互斥功能时
主线程沉睡后放弃对CPU的控制权 ,转入Fun1Proc();线程1得到互斥对象进入循环,沉睡,进入线程2,由于线程2得不到互斥对象
回到线程1,如果可输入条件成立执行COUT<<,而后ReleaseMutex(mutex);我想知道此时为什么进入线程2,去执行线程2了,线程1虽然刚执行完?

解决方案 »

  1.   

    当线程1执行完后,就释放了mutex,而执行线程1前是由于线程2的sleep才使得去执行1了,所以1完了就返回了,继续执行2,这和函数调用函数类似
    如果我没猜错的话,你的代码应该是孙鑫老师的VC书里的,他讲得内容挺不错的
      

  2.   

    是这样的线程1 ReleaseMutex(mutex);后程序为什么不再考虑进入线程1了
    而是直接进入线程2了,线程1不也有WaitForSingleObject(mutex,INFINITE); 
    吗 难道这就好似所谓的“公平原则”?
      

  3.   

    Sleep(1)是使操作系统有时间去执行其它线程,保证双方都在wait这个地方停下来
    当T1 ReleaseMutex(mutex)时,OS就处理与该mutex相关的一些东西.T2的WaitSingleObject就会返回,T2马上就进入就绪态.
    T1迟了一步.然后切换到T2 看表演了
      

  4.   

    Sleep(1)是使操作系统有时间去执行其它线程,保证对方都在wait这个地方停下来 
    当T1 ReleaseMutex(mutex)时,OS就处理与该mutex相关的一些东西.T2的WaitSingleObject就会返回,T2马上就进入就绪态. 
    T1继续执行,但迟了一步.然后切换到T2
      

  5.   

    楼主,看你的代码
    void main() 
    {  
    int a=0; 
      HANDLE hthread1=CreateThread(NULL,0,fun1Proc,NULL,0,NULL); 
      HANDLE hthread2=CreateThread(NULL,0,fun2Proc,NULL,0,NULL); 
      CloseHandle(hthread1); 
      CloseHandle(hthread2); 
      
    mutex=CreateMutex(NULL,FALSE,NULL); 
    Sleep(4000); } 
    感到很怪,有点不解,我帮你调整一下
    void main() 
    {  
    int a=0; 
    mutex=CreateMutex(NULL,FALSE,NULL); 
     HANDLE hthread1=CreateThread(NULL,0,fun1Proc,NULL,0,NULL); 
     HANDLE hthread2=CreateThread(NULL,0,fun2Proc,NULL,0,NULL); 
    //等待一段时间
    //释放
      

  6.   

    我手头上也有一份孙鑫老师的类似的代码,也是先启动线程再CreateMutex的,这样的话,WaitForSingleObject的实参很可能就是一个未创建的句柄哦。我也觉得有问题。不知道是否可以那样做呢?