[英]ResumeThread sometimes doesn't wake threads
我的C ++中有两个函数:一个用于挂起,一个用于恢复线程。 在某些情况下,我需要停止所有线程但是当前它没关系,但是当我必须恢复线程时,有时它不起作用,我不是没有原因。 看方法:
void CDatabaseMonitor::ResumeAllThreads()
{
DWORD dwCurProc = GetCurrentProcessId();
HANDLE hCurProc = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
if (hCurProc != INVALID_HANDLE_VALUE)
{
THREADENTRY32 te = {0};
te.dwSize = sizeof(te);
if (Thread32First(hCurProc, &te))
{
do
{
if (te.dwSize >= FIELD_OFFSET(THREADENTRY32, th32OwnerProcessID) + sizeof(te.th32OwnerProcessID))
{
if (te.th32ThreadID != m_currentThreadId && te.th32OwnerProcessID == dwCurProc)
{
HANDLE thread = ::OpenThread(THREAD_ALL_ACCESS, FALSE, te.th32ThreadID);
if (thread != NULL)
{
ResumeThread(thread);
CloseHandle(thread);
}
}
}
te.dwSize = sizeof(te);
}
while (Thread32Next(hCurProc, &te));
}
CloseHandle(hCurProc);
}
}
上面的代码有什么问题吗? 有没有办法强制线程唤醒? 提前致谢。
你不能这样使用SuspendThread
/ ResumeThread
。 正如文档所说:
此函数主要供调试器使用。 它不适用于线程同步 。 如果调用线程尝试获取挂起线程拥有的同步对象,则在拥有同步对象(如互斥锁或临界区)的线程上调用SuspendThread会导致死锁。 为了避免这种情况,应用程序中不是调试器的线程应该通知另一个线程暂停自身。 目标线程 必须 设计为监视此信号并进行适当响应 。
主要问题是 - 线程暂停时基本上没什么可做的。 如果线程持有你需要的锁,你将死锁等待它释放它。 并且你无法知道该线程可能具有什么锁,因为线程可以在任意点被劫持,以通过库使用的许多机制来执行任意工作。
你永远不会让这个工作,并且你试图通过暂停线程解决的任何问题,你应该解决一些其他,明智的方式。
对于这个问题的规范回答,“如何在同一进程中安全地从另一个线程挂起/恢复线程?” 是“通过该线程的合作,使用线程支持的任何机制。没有该线程的合作,就无法安全地完成。”
每当你觉得你需要从外面“伸手去”做一个正确的线程时,你应该退后一步并重新思考你的设计。 线程应该已经被编码为做什么,而且只做你希望它做的事情。 如果线程需要挂起,则应将其编码为暂停。 如果你必须伸手去做它你想做的事情或不做你不想要的事情,你首先编写错误并应该修复它。 流程中的所有线程都必须合作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.