Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.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
代码步进如何处理线程? 我正在用Visual Studio 2010开发C++。如何设计代码步进来处理新线程的创建_C++_Multithreading_Visual Studio_Visual Studio 2010_Debugging - Fatal编程技术网

代码步进如何处理线程? 我正在用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是启动新线程的特殊函数。它只知道您已要求它跳过函数调用,因此它假定您希望保留在当前线程中。此外,根据调度,新线程可能会立即启动,也可能不会立即启动。例如,您可以在暂停状态下启动新线程。

通常在多线程应用程序中,您不需要单步执行,更可能需要在感兴趣的位置设置断点,并在遇到断点时挂起所有线程。是的,我已经尝试过,请参阅编辑。