Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ ResumeThread有时不';t尾线_C++_Multithreading_Winapi_Visual C++ - Fatal编程技术网

C++ ResumeThread有时不';t尾线

C++ ResumeThread有时不';t尾线,c++,multithreading,winapi,visual-c++,C++,Multithreading,Winapi,Visual C++,我的C++中有两个函数:一个用于挂起,一个用于恢复线程。 在某些情况下,我需要停止所有线程,但当前的,这是好的,但当我必须恢复线程,有时它不工作,我不知道为什么。 参见方法: void CDatabaseMonitor::ResumeAllThreads() { DWORD dwCurProc = GetCurrentProcessId(); HANDLE hCurProc = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);

我的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可能会导致死锁。为了避免这种情况,应用程序中不是调试器的线程应该通知另一个线程挂起自己。目标线程必须设计为监视此信号并做出适当响应

主要的问题是——当线程挂起时,基本上什么都做不了。如果线程持有所需的锁,则会死锁,等待它释放。您无法知道该线程可能拥有什么锁,因为库使用的许多机制可以在任意点劫持线程来执行任意工作

您将永远无法实现这一点,无论您试图通过挂起线程来解决什么问题,您都应该以其他合理的方式来解决

对于“如何在同一进程中安全地从另一个线程挂起/恢复一个线程?”这一问题,标准答案是“有了该线程的合作,就可以使用该线程支持的任何机制。没有该线程的合作,就无法安全地完成。”


任何时候,当你觉得你需要从外面“伸进”来让一根线做正确的事情时,你应该后退一步,重新思考你的设计。线程应该已经被编码为执行您希望它执行的操作,并且只执行您希望它执行的操作。如果线程需要挂起,则应将其编码为挂起自身。如果你必须让它做你想做的或者不做你不想做的,那么你首先就把它编码错了,应该修复它。进程中的所有线程都必须协作。

挂起功能在哪里?当线程被挂起时,你会做什么?除了Dave的答案,请看这里:明白了!非常感谢。问题是,我采取这种方式试图解决这个问题,因为它是一个遗留代码“不可更改”,如果你是指我的话。因此,我尝试了这种变通方法,以避免在合理的旧代码中进行更改。但我会试试别的办法。谢谢