如果 main 在 c 中也是一个线程,为什么它不 运行 与其他线程

If main is a thread as well in c, why doesn't it run with other threads

我读到 main() 本身是单线程,所以当我像这样在我的程序中创建 2 个线程时;

#include<stdio.h>
#include<pthread.h>
#include<windows.h>

void* counting(void * arg){
    int i = 0;
    for(i; i < 50; i++){
        printf("counting ... \n");
        Sleep(100);

    }
}

void* waiting(void * arg){
    int i = 0;
    for(i; i < 50; i++){
        printf("waiting ... \n");
        Sleep(100);
    }
}

int main(){
    pthread_t thread1;
    pthread_t thread2;
    pthread_create(&thread1, NULL, counting, NULL);
    pthread_create(&thread2, NULL, waiting, NULL);
    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);

    int i = 0;
    for(i; i < 50; i++){
        printf("maining ... \n");
        Sleep(1000);
    }


}

在那种情况下 main 真的是一个线程吗? 在那种情况下,如果在 main 中睡眠一段时间,main 不应该将 CPU 给其他线程吗? 主要线程本身在这里吗?我在这里有点困惑。 主线程执行有特定的顺序吗?

 pthread_join(thread1, NULL);
 pthread_join(thread2, NULL);

您要求线程等到 thread1 终止,然后等到 thread2 终止,这就是它所做的。

main() 不是一个线程而是一个函数,所以这是对您最初声明的明确 "no"。但是,如果你读了一些什么是线程的定义,你会发现它是可以调度的东西,即持续执行的代码。此外,如果没有 "ongoing execution of code",运行 程序实际上将无法做任何事情,例如main() 作为第一个入口点。所以,可以肯定的是,程序执行的每一段代码都是线程执行的,无一例外。

顺便说一句:您可以检索当前线程的线程ID。尝试 运行 来自 main() 的那个。它会起作用并为您提供一个值,将此调用与来自其他线程的调用区分开来。

I read that main() is single thread itself

不对,你误会了。每个 C 程序都有一个名为 main() 函数 。程序的 C 语言语义从该函数的初始入口开始。从这个意义上说,特别是当您提供括号时,main() 是一个函数,而不是线程。

但是,每个进程也有一个 主线程 ,它具有一些区别于其他线程的属性。这最初是唯一的线程,因此正是该线程执行了 main() 函数的初始入口。但也是 运行 由 main() 以及这些函数 etc 调用的所有 C 函数的线程,所以一般来说,它不是,特定于 运行 只有直接出现在 main() 正文中的代码,如果这就是 "main() is a single thread itself" 的意思。

, so when i create 2 threads in my program like this; [...] Is main really a thread in that case?

在那种情况下确实有一个主线程,与它启动的两个附加线程分开。

in that case if in main in sleep for some time, shouldn't the main give the CPU to other threads?

如果主线程在其他两个线程中的任何一个处于活动状态时处于休眠状态,那么是的,人们会期望其他线程中的一个或两个获得(更多)CPU 时间。从某种意义上说,这正是发生的事情:主线程依次调用每个其他线程的 pthread_join(),这导致它等待(有些人会说 "sleep"),直到这些线程在它继续之前终止.在等待期间,它不会与其他线程争用 CPU 时间,因为这几乎就是 "waiting" 的意思。但是当主线程到达程序中的 Sleep() 调用时,其他线程已经终止并加入,因为那是 pthread_join() 所做的。它们不再存在,因此在 Sleep().

期间自然不会 运行

Is main a threads itself here?

有一个主线程,是的,它是您特定进程中唯一执行函数 main() 中任何代码的线程。除了在某些线程或其他线程中,什么都不会执行。

I am confused a bit here. Is there a specific order to main thread execution?

如前所述,主线程最初是唯一的线程。许多程序永远不会超过那个。主线程以外的线程仅由主线程或已创建的另一个线程创建。当然,线程在创建之前不能 运行,根据定义,在它们终止之后也不能。线程彼此独立执行,通常没有任何预定义的顺序,除非通过同步对象(如互斥体)、通过专用函数(如 pthread_join())或通过对各种 I/O 对象的协作操作明确建立比如管道。