最近在学多线程,写了一点代码就出现问题了,调试了几天也不知道问题出在哪里,代码如下:#include "stdafx.h"
#include <windows.h>HANDLE Event;
HANDLE Thread[1];
DWORD ThreadID[1], ErrorCode;
int i,j;
BOOL IsEventOK;DWORD WINAPI Thread1Proc(LPVOID lpParameter);
DWORD WINAPI Thread2Proc(LPVOID lpParameter);int main(int argc, char* argv[])
{
Event = CreateEvent(NULL, TRUE, TRUE, NULL);
i=0;
j=0; Thread[0] = CreateThread(NULL, 0, Thread1Proc, NULL, 0, &ThreadID[0]);
Thread[1] = CreateThread(NULL, 0, Thread2Proc, NULL, 0, &ThreadID[1]); WaitForSingleObject(Thread[0], INFINITE);
WaitForSingleObject(Thread[1], INFINITE);
CloseHandle(Thread[0]);
CloseHandle(Thread[1]);
CloseHandle(Event); return 0;
}DWORD WINAPI Thread1Proc(LPVOID lpParameter)
{
while (i++<100)
{
WaitForSingleObject(Event, INFINITE);
IsEventOK = ResetEvent(Event);
printf("线程1在执行\r\n");
IsEventOK = SetEvent(Event);
if (!IsEventOK)
{
ErrorCode = GetLastError();
}
}
return 0;
}DWORD WINAPI Thread2Proc(LPVOID lpParameter)
{
while(j++<100)
{
WaitForSingleObject(Event, INFINITE);
IsEventOK = ResetEvent(Event);
printf("线程2在执行\r\n");
IsEventOK = SetEvent(Event);
if (!IsEventOK)
{
ErrorCode = GetLastError();
}
}

return 0;
}这段代码总是线程1先运行,运行后调用ResetEvent总是成功的,可是再执行SetEvent的时候就出错了,代码总是返回6

解决方案 »

  1.   

    难道没有遇到过这种情况,还是我的理解错误,WaitForSingleObject应该是等到事件有信号为止,我试着在几天机上运行,都是死锁,程序一运行就死了!
      

  2.   

    //多线程运行时要保持同步,以下代码在vc6.0上通过//#include "stdafx.h"
    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>HANDLE Event1, Event2;
    HANDLE Thread[2];
    DWORD ThreadID[2], ErrorCode;
    int i,j;
    BOOL IsEventOK = TRUE;const int g_nRunCount = 20;DWORD WINAPI Thread1Proc(LPVOID lpParameter);
    DWORD WINAPI Thread2Proc(LPVOID lpParameter);int main(int argc, char* argv[])
    {
    Event1 = CreateEvent(NULL, FALSE/*TRUE*/, TRUE, NULL);
    Event2 = CreateEvent(NULL, FALSE/*TRUE*/, /*TRUE*/FALSE, NULL);
    i=0;
    j=0;

    printf("begin run ----->/n");
    // SetEvent(Event);
    Thread[0] = CreateThread(NULL, 0, Thread1Proc, NULL, 0, /*null*/&ThreadID[0]);
    Thread[1] = CreateThread(NULL, 0, Thread2Proc, NULL, 0, &ThreadID[1]);
    WaitForSingleObject(Thread[0], INFINITE);
    WaitForSingleObject(Thread[1], INFINITE); CloseHandle(Thread[0]);
    CloseHandle(Thread[1]);
    CloseHandle(Event1);
    CloseHandle(Event2);

    return 0;
    }DWORD WINAPI Thread1Proc(LPVOID lpParameter)

    while (i < g_nRunCount)
    {
    if (WaitForSingleObject(Event1, INFINITE) != WAIT_OBJECT_0)
    continue;
    ;
    //IsEventOK = ResetEvent(Event);
    printf("线程1在执行, %d\r\n", i);
    IsEventOK = SetEvent(Event2);
    i ++;
    if (!IsEventOK)
    {
    ErrorCode = GetLastError();
    }
    }
    return 0;
    }DWORD WINAPI Thread2Proc(LPVOID lpParameter)
    {
    while(j < g_nRunCount)
    {
    if(WaitForSingleObject(Event2, INFINITE) != WAIT_OBJECT_0)
    continue; //IsEventOK = ResetEvent(Event);
    printf("线程2在执行, %d\r\n", j);
    j ++;
    IsEventOK = SetEvent(Event1);
    if (!IsEventOK)
    {
    ErrorCode = GetLastError();
    }
    }

    return 0;
    }
      

  3.   

    HANDLE Thread[1];
    DWORD ThreadID[1], ErrorCode;
    -->
    HANDLE Thread[2];
    DWORD ThreadID[2], ErrorCode;
      

  4.   

    4楼已经做了完整的代码回答了 。。dword[1]这个仅仅是申明了拥有1个元素的数组而已 。。如果仅仅只申明一个元素的数组是没有意义的。直接DWORD ???就可以了。。WaitForMultipleObjects可以用来等待多个对象。不用重复的调用WaitForSingleObject
      

  5.   

    经常用其他语言编程,声明数组的时候下标可能会有点打混^_^.不过这应该不是问题,我虽然声明dword[1],但是我可以写超过1个的元素,因为C++不会作指针越界的检查,在运行的时候, dword[1]只会把这个指针在dword[0]的基础上向前移动4个字节吧(32位的机子),这样的写法在一些大型软件里面经常有,比如appache.我知道WaitForMultipleObjects是用来待多个内核对象的,但调用两次WaitForSingleObject是不会影响最终结果的吧!