代码步进如何处理线程? 我正在用Visual Studio 2010开发C++。如何设计代码步进来处理新线程的创建
如果我正在单步执行代码,并使用代码步进如何处理线程? 我正在用Visual Studio 2010开发C++。如何设计代码步进来处理新线程的创建,c++,multithreading,visual-studio,visual-studio-2010,debugging,C++,Multithreading,Visual Studio,Visual Studio 2010,Debugging,如果我正在单步执行代码,并使用CreateThread()生成一个新线程,我会输入该线程吗?若否,原因为何 编辑: 我得到了不可预测的结果,即使在线程函数中有断点。有时,我的程序在到达线程函数中的断点之前退出。我只是想知道是什么导致了这种行为。不,我不这么认为。您将在当前线程上继续,直到在另一个线程中遇到断点。这取决于具体情况 如果CreateThread调用的方法在单步执行调用CreateThread的代码时遇到断点,则调试器将切换到该断点和线程。从那时起(直到再次点击F5),执行分步指令(F
CreateThread()
生成一个新线程,我会输入该线程吗?若否,原因为何
编辑:
我得到了不可预测的结果,即使在线程函数中有断点。有时,我的程序在到达线程函数中的断点之前退出。我只是想知道是什么导致了这种行为。不,我不这么认为。您将在当前线程上继续,直到在另一个线程中遇到断点。这取决于具体情况 如果
CreateThread
调用的方法在单步执行调用CreateThread
的代码时遇到断点,则调试器将切换到该断点和线程。从那时起(直到再次点击F5),执行分步指令(F10)有时会在原始线程和由CreateThread
创建的线程之间交替执行
对于在给定中断会话期间创建的每个线程都是如此。但是,一旦您点击F5并再次中断(通过断点或暂停),所有内容都会重置,单步执行只会单步执行最初中断的线程
下面是一个示例应用程序
DWORD WINAPI Thread2(LPVOID lParam)
{
while (true)
{
printf("In Thread 2\n");
}
}
int _tmain(int argc, _TCHAR* argv[])
{
CreateThread( NULL, 0, &Thread2, NULL, 0, NULL);
while (true)
{
printf("In Thread 1\n");
}
return 0;
}
如果我在\u tmain
中的printf
函数上设置断点,点击F5,然后在点击断点后使用F10进行步进,我将永远不会进入Thread2
方法
但是,如果我在\u tmain
和Thread2
的入口点上都设置一个断点,然后按F5,情况就会发生变化。首先,我将按预期击中\u tmain
中的断点。如果在那之后我继续按F10,我最终会按Thread2
中的断点。从那时起,我可以继续点击F10,它将在两个线程之间每隔几步交替
注意:这并不是因为我一直碰到断点。这两个断点只命中一次,因为它们位于方法入口点。调试器的行为只是在已在调试器中显式中断的线程之间进行切换,以达到给定的停止。执行将在当前线程中继续,直到达到断点为止。此断点可以位于单独的线程中,并将按照相同的规则在该线程中继续执行。否,您没有直接调用线程方法(这将破坏线程的用途)。您正在请求运行时与当前线程并行执行线程函数,并尽快启动 如果在所有线程中都没有预定义的断点,那么当您选择“跳过”时,我已经看到MS调试器在线程之间来回跳转,但我不能说我可以判断它是否具有任何可预测性 如果我正在单步执行代码并使用CreateThread()生成一个新线程,我会输入该线程吗 不,单步执行意味着您正在单步执行特定线程的执行上下文。调试器有几种方法来切换正在查看的线程。有一个线程窗口,显示进程中所有线程的信息。您还可以在新线程的入口点设置断点 若否,原因为何
因为调试器不知道CreateThread是启动新线程的特殊函数。它只知道您已要求它跳过函数调用,因此它假定您希望保留在当前线程中。此外,根据调度,新线程可能会立即启动,也可能不会立即启动。例如,您可以在暂停状态下启动新线程。通常在多线程应用程序中,您不需要单步执行,更可能需要在感兴趣的位置设置断点,并在遇到断点时挂起所有线程。是的,我已经尝试过,请参阅编辑。