为什么要在"QueueUserWorkItem"坏的情况下使用"SND_SYNC"?
Why using "SND_SYNC" in a "QueueUserWorkItem" bad?
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.
在这种特定情况下,工作项触发器("按下向下键")和由此产生的线程工作项("发出同步嘟嘟声")非常不平衡,因此,如果用户按住或重复按下他/她的向下键,进程将很快遇到致命问题。
相关文章:
- [WIN API]为什么共享相同的 WriteFile(sync) 和 ReadFile(sync) 句柄会导致 Rea
- boost :: Beast Sync http客户端的超时
- 多次调用存储过程时C++连接器"Commands out of sync" mySQL
- MySQL 异常"connection lost during query"、"MySQL server has gone away"和"command out of sync"
- C 中Bash Sync的替代方案
- GNU make 3.81 - 如何做'--output-sync=target'
- 类型为"double" snd const char [3]' 到二进制'operator<<'的无效操作数
- 适用于C++的 Dropbox Sync API
- cin.sync 和 clear 不起作用
- boost::asio sync server 在第一个连接后不接受连接
- C++:为什么这个 sync() 在这个组合模式中不起作用?
- cin.ignore 和 cin.sync 之间的区别
- 什么时候应该使用std::async和sync作为策略
- emulate std::async with std::launch::sync?
- MySQL:"Commands out of Sync"错误(C 连接器)
- Qt/C++:递归互斥、'sync zones'和阻塞信号
- c++ boost asio sync写入async_receive处理程序
- filebuf::sync在输入缓冲区上做什么
- 在boost iostream filtering_ostream中,sync(), strict_sync()和flu
- 关于fstream缓冲区,flush()和sync()的区别是什么?