DeleteTimerQueueTimer()访问冲突和/或死锁

时间:2013-12-04 14:11:31

标签: c++ windows visual-c++ windows-7-x64

第二个DeleteTimerQueueTimer()生成访问冲突或无效参数异常,或者根据上下文无限制地挂起。 Google测试代码:

HANDLE hTimer = NULL;

static VOID CALLBACK _TimerCallback(PVOID, BOOLEAN)
{
    //::DeleteTimerQueueTimer(NULL, hTimer, NULL);
}

TEST(CTest, TimerQueue)
{
    ASSERT_EQ(FALSE, ::DeleteTimerQueueTimer(NULL, hTimer, NULL));
    ASSERT_EQ(TRUE, ::CreateTimerQueueTimer(&hTimer, NULL, &_TimerCallback, NULL, 40, 0, WT_EXECUTEONLYONCE));
    ASSERT_TRUE(NULL != hTimer);
    Sleep(100);
    ASSERT_EQ(TRUE, ::DeleteTimerQueueTimer(NULL, hTimer, NULL));
    // ******** next line produces SEH or deadlocks *************
    ASSERT_EQ(FALSE, ::DeleteTimerQueueTimer(NULL, hTimer, NULL)); 
}

[RUN] CTest.TimerQueue 未知文件:错误:测试正文中抛出代码为0xc000000d的SEH异常。

1 个答案:

答案 0 :(得分:2)

MSDN说:“Timer [in]:定时器队列定时器的句柄。这个句柄由CreateTimerQueueTimer函数返回。”

您正在为同一DeleteTimerQueueTimer两次致电hTimer。因此,在第二次调用DeleteTimerQueueTimer时,您没有遵守函数规范,因为您传递了一些无效的HANDLE。 Windows可能(在我看来应该)以比使用SEH或挂起更好的方式处理它,但是:垃圾进入,垃​​圾输出