原来zero 2015-01-20 08:52 采纳率: 0%
浏览 1776

sleep和触发事件前后顺序不同的搞笑问题

两个线程,线程1,将变量g__value++,然后 触发事件,sleep(500).线程2,接收事件,打印变量值。 很简单的一个小程序,但我发现 先SetEvent()与先Sleep(),出来的结果不一样。

DWORD WINAPI ThreadSend(LPCVOID pParam)
{
while(1)
{
//InterlockedIncrement((LPLONG)&g_value);
g_value++;

    SetEvent(g_hEvent);
    Sleep(500);  //这两条语句顺序相反,先sleep再发信号则,没有g_value=1的情况

}

return 0;

}
DWORD WINAPI ThreadRecv(LPCVOID pParam)
{
while(1)
{
WaitForSingleObject( g_hEvent,INFINITE);
printf("g_value:%d\n",g_value);
//ResetEvent(g_hEvent);
}
return 0;
}

执行结果是
g_value=0
g_value=1
g_value=2
g_value=3

但是,先sleep再SetEvent(),结果是
g_value=0
g_value=2
g_value=3
g_value=4

就是没有1 这是为什么呢?

  • 写回答

4条回答 默认 最新

  • oyljerry 2015-01-20 09:16
    关注

    volitile取消g_value的优化,定义的地方

    评论

报告相同问题?