#include <windows.h>
#include <stdio.h>HANDLE g_hEvent = NULL;DWORD WINAPI Thread1Proc(
  LPVOID lpParameter   // thread data
)
{
printf("Enter Thread1\r\n");
WaitForSingleObject( g_hEvent, INFINITE );
Sleep(1000);
printf("Leave Thread1\r\n");
return 0;
}DWORD WINAPI Thread2Proc(
  LPVOID lpParameter   // thread data
)
{
printf("Enter Thread2\r\n");
WaitForSingleObject( g_hEvent, INFINITE );
Sleep(1000);
printf("Leave Thread2\r\n");
return 0;
}void main()
{
HANDLE hThread1 = CreateThread( NULL, 0, Thread1Proc, 0, 0, NULL );
HANDLE hThread2 = CreateThread( NULL, 0, Thread2Proc, 0, 0, NULL ); g_hEvent = CreateEvent( NULL, TRUE ,FALSE ,NULL );
Sleep( 3000 );
SetEvent( g_hEvent );
Sleep( 3000 );
CloseHandle( hThread1 );
CloseHandle( hThread2 );
CloseHandle( g_hEvent );
}我写了上面的代码,目的是想测试同一个人工重置的事件被两个线程等待到后的结果。但是发现输入的字符串不稳定,一会输出这个,一会又输出那个,到底是什么原因。

解决方案 »

  1.   

    实际是打印的有问题。其两个线程都是只执行了一次,就出来了。测试的方法是:#include "StdAfx.h"
    #include <windows.h>
    #include <stdio.h>HANDLE g_hEvent = NULL;
    int g_nThread1 = 0;
    int g_nThread2 = 0;DWORD WINAPI Thread1Proc(LPVOID lpParameter)
    {
    g_nThread1++;
        printf("Enter Thread1\r\n");
    printf("g_nThread1 = %d\n", g_nThread1);
        WaitForSingleObject( g_hEvent, INFINITE );
        Sleep(1000);    printf("Leave Thread1\r\n");
        return 0;
    }DWORD WINAPI Thread2Proc( LPVOID lpParameter)
    {
    g_nThread2++;
        printf("Enter Thread2\r\n");
    printf("g_nThread2 = %d\n", g_nThread2);
        WaitForSingleObject( g_hEvent, INFINITE );
        Sleep(1000);
        printf("Leave Thread2\r\n");
        return 0;
    }void main()
    {
        HANDLE hThread1 = CreateThread( NULL, 0, Thread1Proc, 0, 0, NULL );
        HANDLE hThread2 = CreateThread( NULL, 0, Thread2Proc, 0, 0, NULL );

        g_hEvent = CreateEvent( NULL, TRUE ,FALSE ,NULL );
        Sleep( 3000 );
        SetEvent( g_hEvent );
        Sleep( 3000 );
        CloseHandle( hThread1 );
        CloseHandle( hThread2 );
        CloseHandle( g_hEvent );
    }
      

  2.   

    进入线程时打印字符串的确是一个,而在WaitForSingleObject( g_hEvent, INFINITE );之后打印的为什么会有打印再次字符串的现象?
      

  3.   

    线程开始后要等待事件,而你先创建线程后创建事件,想想当线程执行到等待函数的时候会是什么结果?
    另外,VC6需要在项目设置的编译选项中指定多线程运行库,因为单线程运行库运行于多线程时有bug。
      

  4.   


    #include <windows.h>
    #include <stdio.h>HANDLE g_hEvent = NULL;DWORD WINAPI Thread1Proc(
      LPVOID lpParameter   // thread data
    )
    {
        
        WaitForSingleObject( g_hEvent, INFINITE );
    printf("Enter Thread1\r\n");//里面
        Sleep(10);
        printf("Leave Thread1\r\n");
        return 0;
    }DWORD WINAPI Thread2Proc(
      LPVOID lpParameter   // thread data
    )
    {
        
        WaitForSingleObject( g_hEvent, INFINITE );
    printf("Enter Thread2\r\n");//放在里面
        Sleep(10);
        printf("Leave Thread2\r\n");
        return 0;
    }void main()
    {
        HANDLE hThread1 = CreateThread( NULL, 0, Thread1Proc, 0, 0, NULL );
        HANDLE hThread2 = CreateThread( NULL, 0, Thread2Proc, 0, 0, NULL );    g_hEvent = CreateEvent( NULL, TRUE ,FALSE ,NULL );
        Sleep( 3000 );
        SetEvent( g_hEvent );
        Sleep( 3000 );
        CloseHandle( hThread1 );
        CloseHandle( hThread2 );
        CloseHandle( g_hEvent );
    }
    细节问题;楼主好好想想;
      

  5.   

    事实证明这个解释是正确的,牛必啊,为什么你什么都知道呢?
    两个原因:在 选项 - C / C++ CODE 处要设置多线程,再就是创建线程前应该先创建事件。真是奇怪,为什么啥问题原因你都知道?晕。