说明,我这个是看孙鑫老师15课,照着写的一个代码,用VC6.0编译的,但是有问题,说是模拟火车站卖火车票的,但是有时候会多卖出第100张这张票,郁闷啊。
    #include <windows.h>
#include<iostream.h>DWORD WINAPI Fun1Proc(
LPVOID lpParameter   // thread data
);
DWORD WINAPI Fun2Proc(
LPVOID lpParameter   // thread data
);
int index=0;
int tickets=100;
HANDLE hMutex;
void main()
{
  HANDLE  hThread1;
  HANDLE  hThread2;
  hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
  hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
  CloseHandle(hThread1);
  CloseHandle(hThread2);
  hMutex=CreateMutex(NULL,FALSE,NULL);
  //ReleaseMutex(hMutex);
  Sleep(1000);
}
DWORD WINAPI Fun1Proc(
LPVOID lpParameter   // thread data
)
{  
 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   // thread data
  )
{  
   while (TRUE)
   {
     WaitForSingleObject(hMutex,INFINITE);
 if(tickets>0)
 {
  Sleep(1);   cout<<"thread2 sell ticket : "<<tickets--<<endl;
     }
 else 
break;
 ReleaseMutex(hMutex);
   }return 0;
}
不要sleep(1);就没问题了,但是视屏上有的,他是为了测试
WaitForSingleObject(hMutex,INFINITE);
ReleaseMutex(hMutex);
这两个配对会消除那个bug的。
具体的很奇怪 ,我把sleep()里面的时间设置不一样的话,就不会出现这个了,大家给点意见啊谢谢了

解决方案 »

  1.   

    CreateMutex必须在创建线程之前调用。他是用来控制线程的,如果你不保证他在线程创建之前调用,子线程完全可以抢先执行,失去控制
      

  2.   

    而且int tickets=100;
    必须加volatile修饰,否则寄存器有可能缓冲这个变量,导致tickets--得不到想要的效果
      

  3.   

    都给你指出两个错误了,不知道你为什么还怀疑别人有bug。尤其是初学者,怀疑编译器bug还是不要作为第一选项,一般情况下,编译器都有bug,但是你代码出现bug的可能性要高多了