首页 > 解决方案 > 使用 Pthread 库在程序输出中切换线程上下文

问题描述

我目前正在研究多线程和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 函数的顺序并不是连续发生的。我猜它可能会受到线程调度中的线程上下文切换的影响。我对这个问题的想法对吗?谢谢你的帮助!

标签: cmultithreadingpthreads

解决方案


是的你是对的。正在执行三个线程,由操作系统的调度程序来调度线程并执行上下文切换。因此,每次运行此代码时可能不会得到相同的输出


推荐阅读