gpt4 book ai didi

c++ - 使用大线程池调试多线程 C++ 应用程序

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:00:37 24 4
gpt4 key购买 nike

我有一个在 VS2014 SP2 下运行的 native C++ 应用程序,它使用我自己的线程池类使用大量多线程。通常,应用程序在任何时候都会有超过 32 个线程在运行,其中大部分时间大部分时间都处于空闲状态。调试器中是否有任何方法可以查看线程 View 中的哪些线程处于空闲状态(即在 sleep 函数中),目前,如果我中断执行,调试器通常会将我带回非事件线程的 sleep 部分;

UINT    _cdecl MyThreadFunc(LPVOID pParam)
{
CMyThreadSlot *pThreadInfo = (CMyThreadSlot*)pParam;
while (pThreadInfo->m_pManager->m_Active)
{
try
{
if (pThreadInfo->m_pActivity)
{
pThreadInfo->m_pActivity->Execute();
pThreadInfo->m_pActivity = NULL;
}
else
Sleep(50); <-- breaking execution ends up here
}
catch (CUserException* e)
{
e->Delete();
if (pThreadInfo->m_pActivity)
if (pThreadInfo->m_pActivity->m_pThreadGroup)
pThreadInfo->m_pActivity->m_pThreadGroup->m_ExceptionThrown = TRUE;
}
}
return CMyThreadManager::ExitOk;
}

如果我在中断后停在这里,我目前必须遍历每个线程的调用堆栈以查看实际执行的内容,这可能会很痛苦。即使我闯入了其他代码,我仍然想知道哪些其他线程没有休眠并检查它们在做什么。

编辑: 好吧,足够笨拙的解决方案,但启动 Process Explorer ,右键单击我正在运行的应用程序,选择属性线程允许我按 CPU 使用率对线程进行排序,使用事件线程的线程 ID 然后让我找出正在使用的线程。主要缺陷是这必须在中断正在运行的应用程序之前完成。

最佳答案

想通了。技巧是初始化低于正常优先级的线程,在运行时将它们设置为正常,然后重置为低于正常。在调试器的线程 View 中,按优先级排序然后为您提供事件线程。所以从前面的代码来看,线程被初始化为

    CWinThread *pWinThread = AfxBeginThread(MyThreadFunc, MyThreadSlotObject, THREAD_PRIORITY_BELOW_NORMAL);
MyThreadSlotObject->m_hThread = pWinThread->m_hThread;

并对之前的代码修改如下;

        if (pThreadInfo->m_pActivity)
{
SetThreadPriority(pThreadInfo->m_hThread, THREAD_PRIORITY_NORMAL);
pThreadInfo->m_pActivity->Execute();
SetThreadPriority(pThreadInfo->m_hThread, THREAD_PRIORITY_BELOW_NORMAL);
pThreadInfo->m_pActivity = NULL;
}

编辑:如果您不想更改优先级,看起来您也可以通过thread naming 来完成。足够方便。

关于c++ - 使用大线程池调试多线程 C++ 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37067735/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com