为什么要在"QueueUserWorkItem"坏的情况下使用"SND_SYNC"?

Why using "SND_SYNC" in a "QueueUserWorkItem" bad?

本文关键字:SND SYNC QueueUserWorkItem 为什么 情况下      更新时间:2023-10-16

Larry Osterman写到在微软的代码中发现了一个真正的错误,违规代码是

static DWORD WINAPI _PlayBeep(__in void* pv)
{
    UNREFERENCED_PARAMETER(pv);
    PlaySound(L".Default"NULL, SND_SYNC | SND_ALIAS);
    return 0;
}
LRESULT WndProc(...)
{
    :
    :
    case WM_KEYDOWN:
        if (!_AcceptInputKeys(wParam, lParam))
        {
            QueueUserWorkItem(_PlayBeep, NULL, 0);
        }
        break;
}

拉里问:

考虑到代码的简单性上面,为了得到正确的答案不足以说明问题所在代码(问题应该是显而易见)。你还需要能够解释为什么情况如此糟糕(换句话说,当你这样做)。

,最好的答案是评论中的简洁是不够的

大卫非常接近正在发生的事情错误-现在想想应用程序。

有人能详细解释一下当这个代码运行时发生了什么吗?

阅读答案页面,它有一个非常详细的解释

http://blogs.msdn.com/b/larryosterman/archive/2009/06/29/what-s-wrong-with-this-code-part-26-the-answer.aspx

基本上,不要将QueueUserWorkItem用于长时间运行的工作项,因为这可能会导致进程中的线程耗尽,或者如果您在(必然)有限大小的线程池上等待工作项完成,甚至会以非常难以调试的方式导致死锁。同样适用于。此API线程池的净等价物。QueueUserWorkItem btw.

在这种特定情况下,工作项触发器("按下向下键")和由此产生的线程工作项("发出同步嘟嘟声")非常不平衡,因此,如果用户按住或重复按下他/她的向下键,进程将很快遇到致命问题。