#include <windows.h>
#include <iostream.h>DWORD WINAPI Fun1Proc(
  LPVOID lpParameter   // thread data
);
DWORD WINAPI Fun2Proc(
  LPVOID lpParameter   // thread data
);
int tickets=100;
CRITICAL_SECTION g_csA;
void main()
{
HANDLE hThread1;
HANDLE hThread2;
InitializeCriticalSection(&g_csA);
hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
CloseHandle(hThread1);
CloseHandle(hThread2); Sleep(4000);
DeleteCriticalSection(&g_csA);}DWORD WINAPI Fun1Proc(
  LPVOID lpParameter   // thread data
)
{
while(TRUE)
{
EnterCriticalSection(&g_csA); if(tickets>0)
{
Sleep(1);
cout<<"thread1 sell ticket : "<<tickets--<<endl;
}
else
break;

LeaveCriticalSection(&g_csA);
}

cout<<"erro1"<<endl;
return 0;
}DWORD WINAPI Fun2Proc(
  LPVOID lpParameter   // thread data
)
{

while(TRUE)
{ EnterCriticalSection(&g_csA);
if(tickets>0)
{
Sleep(1);
cout<<"thread2 sell ticket : "<<tickets--<<endl;
}
else
break;

LeaveCriticalSection(&g_csA); } cout<<"erro2"<<endl;
return 0;
}
最先发现这个程序有时运行会发生内存错误,后来在最后加了cout<<"erro1"<<endl; cout<<"erro2"<<endl;
按理说这两句话都应该执行才对,但每次都只执行了其中一条,请高手指教

解决方案 »

  1.   

    break前记得leave if(tickets>0)
    {
    Sleep(1);
    cout<<"thread1 sell ticket : "<<tickets--<<endl;
    LeaveCriticalSection(&g_csA);
    }
    else
    {
    LeaveCriticalSection(&g_csA);
    break;
    }
      

  2.   

    一直都是照着写的,感觉孙鑫老师写的也不全对,这也不是第一个错误
    对了。改了代码之后,有时会出现 erro2 erro2 erro1这样的结果
    该怎么解释呢,谢谢
      

  3.   

    VC6?选择C/C++ Code Generation 运行库为multithreaded(debug)
      

  4.   

    谢谢,问题解决了,为什么要改为multithreaded(debug)呢?
    是不是多线程程序都要选中这一项,先前erro2 erro2 erro1这样的结果
    我感觉不可理解
      

  5.   

    VC6的CRT还保留着单线程的版本,如果在多线程环境中用C运行库一定要选择对应的多线程CRT
    VC的后续版本CRT都是多线程版本的,不用设置