原来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的优化,定义的地方

    评论

报告相同问题?

悬赏问题

  • ¥15 Java+vue部署版本反编译
  • ¥100 对反编译和ai熟悉的开发者。
  • ¥15 带序列特征的多输出预测模型
  • ¥15 Python 如何安装 distutils模块
  • ¥15 关于#网络#的问题:网络是从楼上引一根网线下来,接了2台傻瓜交换机,也更换了ip还是不行
  • ¥15 资源泄露软件闪退怎么解决?
  • ¥15 CCF-CSP 2023 第三题 解压缩(50%)
  • ¥30 comfyui openpose报错
  • ¥20 Wpf Datarid单元格闪烁效果的实现
  • ¥15 图像分割、图像边缘提取