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



我读到main((本身是一个线程,所以当我在程序中创建两个线程时,就像这样;

#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((本身就是单线程

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

然而,每个进程也有一个主线程,该线程具有一些区别于其他线程的属性。这最初是唯一的线程,因此它是执行main()函数初始入口的线程。但也是那个线程运行main()调用的所有C函数,以及这些函数调用的。,因此,一般来说,它并不是只运行直接出现在main()主体中的代码所特有的,如果这就是你所说的"main((本身就是一个线程"的意思的话。

,所以当我在我的程序中创建2个线程时,就像这样;[…]在这种情况下,main真的是一个线程吗?

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

在这种情况下,如果main处于睡眠状态一段时间,那么main不应该将CPU交给其他线程吗?

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

这里是main线程本身吗?

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

我有点困惑。主线程执行有特定的顺序吗?

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

main()不是一个线程,而是一个函数,因此这里对您的初始声明明确表示"否"。然而,如果你阅读了什么是线程的一些定义,你会发现它是可以调度的,即正在进行的代码执行。此外,如果没有main()作为第一个入口点,运行中的程序在没有"正在进行的代码执行"的情况下将无法实际执行任何操作。因此,毫无疑问,程序执行的每一个代码都是由线程执行的,无一例外。

BTW:您可以检索当前线程的线程ID。试着从main()运行它。它将起作用,并为您提供一个值,将此调用与其他线程的调用区分开来。

最新更新