两个线程,排队进入临界区,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”捕获。

解决方案 »

  1.   

    “还有 在程序中去掉try和catch后调试,会显示”
        InitializeCriticalSection(&g_cs);
    要放在 创建线程 前 (或者 先 Suspend ,最后 Resume)
      

  2.   

    ”放在线程创建的后面有什么不适吗,“ 可是线程 已经 在 执行了。(或者 线程创建时先 Suspend ,初始化临界区后,再 Resume)
      

  3.   


    不过此时应该是主线程在运行吧,要等到sleep把主线程挂起以后,才调度子线程吧。
      

  4.   

    “还有为什么try和catch会忽略这个错误。”
    try 和 catch 是 C++ 的 不是 SEH ,要 打开 C++ 的 设置。
     另外 Fun1Proc 的 catch 怎么 在 while 外 ?
      

  5.   

    “不过此时应该是主线程在运行吧,要等到sleep把主线程挂起以后,才调度子线程吧。”
    想当然!
    CreateThread 文档 并没有 说 等待。 只有 suspend 才 会 等待到 resume。
      

  6.   

    是在while内的,可能是我格式没有对齐。我想问下用临界区,无法实现线程1和线程2交替执行?
      

  7.   

    给你改了改:#include  <windows.h>
    #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;
    }
      

  8.   


    volatile int tickets=1000; while((tickets%2)==1)
    {
    LeaveCriticalSection(&g_cs);
    cout<< "Wait Thread2 to be scheduled" <<endl;
    Sleep(0);
    EnterCriticalSection(&g_cs);
    }在 本程序运行时,打开 网页。
      

  9.   

    哥们 你一直纠结在这个问题上干嘛。本来线程就是由操作系统调度的,哪个线程被调度是随机的。
    你一定要让两个线程交替运行的话,可使用一个变量来标示上一次调度的是哪个线程,如果上次调度的线程是本线程,sleep一下不就行了?
      

  10.   

    EnterCriticalSection(&g_cs);临界区不能保证2个线程执行的顺序的吧,临界区主要用来防止资源被同时访问。要严格控制执行顺序,用Event呗。
      

  11.   

        hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
        hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
    语句以后线程已经开执行了,然后你才初始化临界区,晚了点。还有Sleep(1)木有意义,Sleep()根本无法精确到1ms。其他的逻辑部分我就没看了。
      

  12.   

    用核心编程上的说法  临界区就是飞机上的厕所  进了厕所的人 可以在里上几次都没问题  所以 临界区只是用于资源访问控制 而不是同步 推荐楼主看看 这位仁兄的博客 应该就清楚了 http://blog.csdn.net/morewindows/article/details/7442639
      

  13.   

    CreatThread之后 主线程不等待子线程结束 你就closehandle 合适吗