我读到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()
运行它。它将起作用,并为您提供一个值,将此调用与其他线程的调用区分开来。