Почему использование «SND_SYNC» в «QueueUserWorkItem» плохо? - PullRequest
1 голос
/ 22 июня 2011

Ларри Остерман пишет о реальной ошибке, обнаруженной в коде Microsoft, код ошибки -

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;
}

и Ларри спрашивает:

Учитывая простоту кода выше, чтобы получить правильный ответ, это недостаточно сказать, что не так с код (проблема должна быть ослепительно очевидно). Вам также нужно быть в состоянии объяснить, почему это так плохо (другими словами, что ломается, когда вы сделай это).

Лучший ответ - кратко в комментариях недостаточно,

Дэвид ОЧЕНЬ близок к тому, что происходит неправильно - теперь подумайте о контексте приложение.

Может кто-нибудь объяснить, что происходит, когда этот код запускается?

1 Ответ

1 голос
/ 22 июня 2011

Прочитайте страницу ответов, там есть очень подробное объяснение

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

По сути, не используйте QueueUserWorkItem для долго выполняющихся рабочих элементов, потому что это может привести к исчерпанию потокав вашем процессе, или даже в очень трудной для отладки тупиковой ситуации, если вы ожидаете завершения рабочих элементов в (обязательно) пуле потоков конечного размера.То же самое касается .Net-эквивалента этого API ThreadPool.QueueUserWorkItem btw.

В этом конкретном случае триггер рабочего элемента («нажмите клавишу« вниз »») и результирующий рабочий элемент потока («»звучит синхронный звуковой сигнал ") очень несбалансированно, поэтому, если пользователь удерживает нажатой клавишу или несколько раз нажимает клавишу" вниз ", процесс быстро вызовет фатальные проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...