使用 Pthread 库在程序输出中进行线程上下文切换

Thread context switching in program output using Pthread library

目前正在研究多线程和Pthread。我写了这样一个序列程序:

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

void foo(){
  
   for(int i = 0; i < 3; i++){
       printf("Hello world from foo\n");
   }
  
}
void foo1(){
 
   for(int i = 0; i < 3; i++){
       printf("Hello world from foo1\n");
   }
   
}

void bar(){
  
    for(int i = 0; i < 2; i++){
       printf("Hello world from bar\n");
   }
}

int main(){
  
    foo();
    foo1();
    bar();
   
    for(int i = 0; i < 2; i++){
       printf("Hello world from main\n");
    }


}

显然,这个程序的输出始终是相同的:

Hello world from foo
Hello world from foo
Hello world from foo
Hello world from foo1
Hello world from foo1
Hello world from foo1
Hello world from bar
Hello world from bar
Hello world from main
Hello world from main

当我使用Pthread 修改源代码时,输​​出有时会变得混乱。这是我修改后的代码和示例输出:

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

void* foo(){
   for(int i = 0; i < 3; i++){
       printf("Hello world from foo\n");
   }
}
void* foo1(){
   for(int i = 0; i < 3; i++){
       printf("Hello world from foo1\n");
   }
}

void bar(){
    for(int i = 0; i < 2; i++){
       printf("Hello world from bar\n");
   }
}

int main(){
  
    pthread_t t1,t2;

    pthread_create(&t1,NULL,foo,NULL);
    pthread_create(&t2,NULL,foo1,NULL);
    
    bar();
    pthread_join(t1,NULL);
    pthread_join(t2,NULL);
   
   
    for(int i = 0; i < 2; i++){
       printf("Hello world from main\n");
    }


}
Hello world from foo
Hello world from foo
Hello world from foo
Hello world from bar
Hello world from foo1
Hello world from foo1
Hello world from foo1
Hello world from bar
Hello world from main
Hello world from main

从上面的输出我们可以看出,bar函数中print函数的顺序并不是连续发生的。我猜它可能受到线程调度中线程上下文切换的影响。 我对这个问题的想法对吗? 感谢您的帮助!

是的,你是对的。正在执行三个线程,由操作系统的调度程序来调度线程和执行上下文切换。因此,您每次 运行 此代码

时可能不会得到相同的输出