繁体   English   中英

ResumeThread有时不会唤醒线程

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM