两个线程,排队进入临界区,Sleep(1)使等待时间足够长,必然出现你一次我一次,严格的交替。在VC中调试程序时,Output窗口有时会出现“First-chance exception in xxx.exe...”这样的信息。一般来说,这是由于程序中发生了异常,被VC捕获而产生的输出。
在调试器中运行程序时,如果程序产生异常,调试器会首先获得通知(即First-chance exception),而后此异常由产生它的程序负责捕获。如果程序没有捕获此异常,那么调试器会再次被通知(即Second-chance exception,Last-chance exception),并结束程序。
通常见到的“First-chance exception”一般是“0xC0000005: Access Violation”,“0xC00000FD: Stack Overflow”等,这些都说明程序中有缺陷,需要修正。
但是也有一些属于正常的情况,例如“First-chance exception in xxx.exe (KERNEL32.DLL): 0xE06D7363: Microsoft C++ Exception”。Windows 操作系统中广泛使用了结构化异常(SEH)来处理特殊情况,许多和底层打交道的API都靠SEH来处理可能发生的意外。并且,这些API中都有捕获SEH的代码,产生的异常不会对程序造成影响。但是由于上面提到的“First-chance exception,Second-chance exception”机制,VC仍然会有输出,但是我们完全可以忽略。如果你实在不喜欢这些输出信息,那你就必须禁用对特定异常的“First-chance exception”捕获。
在调试器中运行程序时,如果程序产生异常,调试器会首先获得通知(即First-chance exception),而后此异常由产生它的程序负责捕获。如果程序没有捕获此异常,那么调试器会再次被通知(即Second-chance exception,Last-chance exception),并结束程序。
通常见到的“First-chance exception”一般是“0xC0000005: Access Violation”,“0xC00000FD: Stack Overflow”等,这些都说明程序中有缺陷,需要修正。
但是也有一些属于正常的情况,例如“First-chance exception in xxx.exe (KERNEL32.DLL): 0xE06D7363: Microsoft C++ Exception”。Windows 操作系统中广泛使用了结构化异常(SEH)来处理特殊情况,许多和底层打交道的API都靠SEH来处理可能发生的意外。并且,这些API中都有捕获SEH的代码,产生的异常不会对程序造成影响。但是由于上面提到的“First-chance exception,Second-chance exception”机制,VC仍然会有输出,但是我们完全可以忽略。如果你实在不喜欢这些输出信息,那你就必须禁用对特定异常的“First-chance exception”捕获。
解决方案 »
- 在vs2010中调用matlab时出错:redefine
- 使用SkinPPWTL.DLL界面库出现问题
- 怎么LPTSTR把转char*?!
- 告急!工具栏!
- 请问"无法定位序数5076于动态链接库MFC42D.DLL"是什么错误?
- 一个关于程序恢复上次退出时的界面的问题
- activedesktop无法在桌面上显示网页,不知是何原因,请大侠指点,多谢!特急,解决送100分
- 30分求教一个小简单概念问题,什么是逻辑画笔?(看过《windows程序设计〉的请进)
- .vcd是什么格式,用什么可以打开
- 简单问题,请指点
- 求助::使用共享库的mfc编译出来的程序没问题,改为静态库出问题了
- 【求助】关于两台电脑传输视频(udp协议)
InitializeCriticalSection(&g_cs);
要放在 创建线程 前 (或者 先 Suspend ,最后 Resume)
不过此时应该是主线程在运行吧,要等到sleep把主线程挂起以后,才调度子线程吧。
try 和 catch 是 C++ 的 不是 SEH ,要 打开 C++ 的 设置。
另外 Fun1Proc 的 catch 怎么 在 while 外 ?
想当然!
CreateThread 文档 并没有 说 等待。 只有 suspend 才 会 等待到 resume。
#include <iostream.h>DWORD WINAPI Fun1Proc( LPVOID lpParameter );
DWORD WINAPI Fun2Proc( LPVOID lpParameter );volatile int tickets=100;
CRITICAL_SECTION g_cs;void main()
{
HANDLE hThread1;
HANDLE hThread2;
InitializeCriticalSection(&g_cs);
hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
while(tickets >0);
CloseHandle(hThread1);
CloseHandle(hThread2);
DeleteCriticalSection(&g_cs);
}DWORD WINAPI Fun1Proc( LPVOID lpParameter )
{
while(TRUE)
{
EnterCriticalSection(&g_cs);
if(tickets>0)
{
tickets --;
cout<<"Thread1 sell ticket : "<<tickets <<endl;
}
while((tickets%2)==1)
{
LeaveCriticalSection(&g_cs);
Sleep(0);
EnterCriticalSection(&g_cs);
}
LeaveCriticalSection(&g_cs);
}
return 0;
}
DWORD WINAPI Fun2Proc( LPVOID lpParameter )
{
while(TRUE)
{
EnterCriticalSection(&g_cs);
if(tickets>0)
{
tickets --;
cout<<"Thread2 sell ticket : "<< tickets <<endl;
}
while((tickets%2)==0)
{
LeaveCriticalSection(&g_cs);
Sleep(0);
EnterCriticalSection(&g_cs);
}
LeaveCriticalSection(&g_cs);
}
return 0;
}
volatile int tickets=1000; while((tickets%2)==1)
{
LeaveCriticalSection(&g_cs);
cout<< "Wait Thread2 to be scheduled" <<endl;
Sleep(0);
EnterCriticalSection(&g_cs);
}在 本程序运行时,打开 网页。
你一定要让两个线程交替运行的话,可使用一个变量来标示上一次调度的是哪个线程,如果上次调度的线程是本线程,sleep一下不就行了?
hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
语句以后线程已经开执行了,然后你才初始化临界区,晚了点。还有Sleep(1)木有意义,Sleep()根本无法精确到1ms。其他的逻辑部分我就没看了。