【问题标题】:I wrote a single-thread program using codeblocks but in task manager it shows that the program is using 2 threads?我使用代码块编写了一个单线程程序,但在任务管理器中它显示该程序正在使用 2 个线程?
【发布时间】:2019-08-10 21:47:04
【问题描述】:

我用代码块写了一个程序,代码如下所示。

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
    int Param, i, j, k;
    if(argc != 2){
        fprintf(stderr, "An integer parameter is required \n");
        return -1;
    }
    Param = atoi(argv[1]);
    if(Param<0){
        fprintf(stderr, "An integer >= 0 is required \n");
    }

    printf("first \n");
    for(i = 0; i < 1500; i++)
        for(j = 0; j < 1500; j++)
            for(k = 0; k < 1500; k++);

    printf("second \n");
    for(i = 0; i < 1500; i++)
        for(j = 0; j < 1500; j++)
            for(k = 0; k < 1500; k++);
    printf("Done \n");

    return 0;
}

在程序中,我没有使用任何多线程函数和库,如 windows.h 或 thread.h。但是当我打开任务管理器观察它使用的线程时,我很惊讶程序使用了 2 个线程。我不知道为什么会发生这种情况。在编译器编译我的程序时,我编写的程序中是否添加了一些东西? 请帮助我找出其中的奥秘。

这是关于问题的图片。

【问题讨论】:

  • 您似乎有多个single-thread.exe 程序,其中一些似乎创建了线程(尽管可执行程序的名称)。您确定它不是仍在运行的其中之一吗?
  • 我只有一个叫做single-thread.exe的程序,而且我确信只有一个程序同时调用single-thread.exe。
  • 如果我使用 visualstudio ,线程将变为 4 个线程。很奇怪。
  • 当您运行调试构建时,可能会发生比您编写的代码更多的事情。例如,程序可能正在与您的 IDE 通信以帮助您进行调试(因此您可以检查值、查看崩溃的位置等)。这些东西可能在它们自己的线程中运行,并构成了小程序的大部分内存使用。别担心。
  • 您使用的是 Win10,适合现代操作系统,它确实利用了您的机器具有多个处理器内核。他们可以更快地启动您的程序。详情are here.

标签: c windows multithreading


【解决方案1】:

这可能是隐式并行的情况,您的 CPU/编译器将利用指令级并行(简称ILP)来提高顺序处理器性能。由于您的两个 for 循环彼此独立,您的编译器将使用 vectorization 并且您的处理器将自动创建线程以缩短执行时间。因此,您运行 2 个甚至 4 个线程,具体取决于您的编译器/系统。

【讨论】:

  • 为什么编译器会不请自来地自动执行此操作?我非常怀疑。特别是由于线程创建开销,在多个线程中执行此代码将不如单个线程有效。流水线与线程无关,由 CPU 处理。
  • “指令级别”这个词让我觉得 ILP 发生在指令级别,而不是“多线程(指令)”。
  • 没有。这是操作系统创建的工作线程。与编译器无关
  • @Brendan ILP 允许重叠(即并行化 => 使用多个线程)指令,甚至对执行的指令重新排序。
  • @RbMm ILP 也在处理器级别实现,这意味着它可以在操作系统级别创建线程。
猜你喜欢
  • 1970-01-01
  • 2012-03-13
  • 2016-11-28
  • 1970-01-01
  • 2020-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-05
相关资源
最近更新 更多