背景:是一个手工设置的事件对象线程A的执行函数a(int tmp)                                 线程B的执行函数b()
{                                             {
    g_Var = tmp ;                               waitforsingleobject(事件对象)
                                                       .... //假设这里执行了10000行代码,消耗10秒的时间
    setevent(事件对象)                            printf("%d",g_Var);
                                                resetevent(事件对象)
}                                             }问:在此情况下,如果线程B仍在执行那10000行的代码,还没到执行resetevent这一步的时候,线程A又开始执行了,这时候,会再次执行setevent,还是等线程B执行完resetevent后,再去执行setevent呢,它们三者之间,是否有个先后次序的规则?请指教!

解决方案 »

  1.   

    三者先后次序主要看
    waitforsingleobject(事件对象)
      

  2.   

    有信号状态再setevent(事件对象)  还是有信号状态,直到线程B,resetevent(事件对象)才设置为无 信号状态
    会再次执行setevent//执行
    还是等线程B执行完resetevent后,再去执行setevent呢,//不等待
    它们三者之间,是否有个先后次序的规则?因该没有,只有waitforsingleobject(事件对象),如果 事件对象有信号执行,无信号堵塞等待。
      

  3.   

    如果是这样的话,,反正waitforsingleobject(事件对象),有返回值就执行它保护内的代码了,那不是可以不用resetevent了
      

  4.   

    The state of a manual-reset event object remains signaled until it is set explicitly to the nonsignaled state by the ResetEvent function. Any number of waiting threads, or threads that subsequently begin wait operations for the specified event object by calling one of the wait functions, can be released while the object's state is signaled. The state of an auto-reset event object remains signaled until a single waiting thread is released, at which time the system automatically sets the state to nonsignaled. If no threads are waiting, the event object's state remains signaled. 
      

  5.   

    手工设置的事件对象将会保持有信号知道明确地通过ResetEvent函数使它无信号。...
      

  6.   

    The ResetEvent function is used primarily for manual-reset event objects, which must be set explicitly to the nonsignaled state.就是说,如果先执行B,则WaitForSingleObject->ResetEvent->SetEvent->WaitForSingleObject。
    先执行A:SetEvent->WaitForSingleObject->ResetEvent->SetEvent。不知道理解的对不
      

  7.   

    线程B仍在耗时执行的时候 线程A的SetEvent执行没有任何意义 因为随后就被Reset了
    这样的线程同步可以用两个手动Event(A B) A初始为Singal状态
    线程A  WaitForSingleObject(A) -> SetEvent(B)
        B  WaitForSingleObject(B) -> ReSetEvent(B) ReSetEvent(A) 
      

  8.   

    应该是ReSetEvent(B)   SetEvent(A)   A为自动恢复的Event
      

  9.   

    waitforsingleobject后事件为无信号状态,无需在waitforsingleobject后resetevent,setevent和resetevent无次序,就是说不管事件有无信号,都可以执行setevent或resetevent.
      

  10.   

    http://www.codeproject.com/KB/winsdk/Win32_Event_Handling.aspx
    参考一下这个链接
      

  11.   

    多谢大家的分析,以下是我的测试结果,置于它们三者的联系或执行次序,留待大家通过结果总结了!手动设置
    G_EVENT = CreateEvent(NULL, TRUE, FALSE, NULL);DWORD WINAPI Handle_AProc(LPVOID wParam)
    {
    while(A<20)
    {
    A = A + 1;
    TRACE("A-Thread : %d\n", A);
    SetEvent(G_EVENT);
    Sleep(1000);
    } return 0;
    }DWORD WINAPI Handle_BProc(LPVOID wParam)
    {
    while(1)
    {
            WaitForSingleObject(G_EVENT, INFINITE);

    Sleep(5000);
    TRACE("B-Thread : %d\n",A); ResetEvent(G_EVENT);
    }
    return 0;
    }执行结果:
    A-Thread : 1
    A-Thread : 2
    A-Thread : 3
    A-Thread : 4
    A-Thread : 5
    A-Thread : 6
    B-Thread : 6
    A-Thread : 7
    A-Thread : 8
    A-Thread : 9
    A-Thread : 10
    A-Thread : 11
    B-Thread : 11
    A-Thread : 12
    A-Thread : 13
    A-Thread : 14
    A-Thread : 15
    A-Thread : 16
    B-Thread : 16
    A-Thread : 17
    A-Thread : 18
    A-Thread : 19
    A-Thread : 20
    B-Thread : 20
      

  12.   

    15楼的结果肯定是有问题的。
    实际运行不可能有你这样的结果吧,除非你运气好。我这执行的结果就是这样:a-thread:2
    a-thread:3
    a-thread:4
    a-thread:5
    ba--tthhrreeaadd::56a-thread:7
    a-thread:8
    a-thread:9
    a-thread:10
    b-tah-rteharde:a1d0:
    11
    a-thread:12
    a-thread:13
    a-thread:14
    a-thread:15
    b-thread:15
    a-thread:16
    a-thread:17
    a-thread:18
    a-thread:19
    a-thread:20
    b-thread:20