繁体   English   中英

代码步进如何与线程一起工作?

[英]How does code stepping work with threads?

我正在用Visual Studio 2010开发C ++。如何设计代码步进来处理新线程的创建?

如果我单步执行代码,并使用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;
}

如果我在_tmainprintf函数上放置一个断点, _tmain F5,然后在击中断点后使用F10步进,我将永远不会进入Thread2方法。

但是,如果我在_tmainThread2的入口点都设置了一个断点,然后按F5,则情况将发生变化。 首先,我将按预期达到_tmain的断点。 如果此后我继续按F10,则最终将达到Thread2的断点。 从那时起,我可以继续按F10,它将在两个线程之间交替执行几步。

注意:这不是因为我不断碰到断点。 由于两个断点均在方法入口点,因此仅命中一次。 这只是调试器的行为,可以在已针对调试器中的给定停止明确插入的线程之间交替。

不,我不这么认为。 您将继续在当前线程上运行,直到在另一个线程中遇到断点为止。

执行将在当前线程中继续进行,直到遇到断点为止。 该断点可以位于单独的线程中,并且将遵循相同规则在该线程中继续执行。

不,您不是在直接调用线程方法(这会破坏线程的用途)。 您要求运行时与当前线程并行执行线程功能,并尽快开始执行。

如果您在所有线程中都没有预定义的断点,那么当您选择“ step over”时,我会看到MS调试器在线程之间来回跳动,但是我不能说我可以确定它是否具有可预测性。

如果我单步执行代码,并使用CreateThread()生成新线程,是否可以输入该线程?

不,单步执行意味着您正在逐步执行特定线程的执行上下文。 调试器有几种方法可以切换您正在查看的线程。 有一个“线程”窗口,其中显示有关进程中所有线程的信息。 您还可以在新线程的入口点设置一个断点。

如果没有,为什么不呢?

因为调试器不知道CreateThread是启动新线程的特殊函数。 它只是知道您已要求它单步执行函数调用,因此它假定您希望保留在当前线程中。 同样,根据调度,新线程可能会立即启动,也可能不会立即启动。 例如,您可以在暂停状态下启动新线程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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