Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用Pthread库在程序输出中切换线程上下文_C_Multithreading_Pthreads - Fatal编程技术网

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

C 使用Pthread库在程序输出中切换线程上下文,c,multithreading,pthreads,C,Multithreading,Pthreads,我目前正在学习多线程和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++){

我目前正在学习多线程和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");
    }


}
当我使用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");
    }


}
从上面的输出可以看出,bar函数中打印函数的顺序不是连续发生的。我想这可能会受到线程调度中线程上下文切换的影响。 我对这个问题的想法正确吗?
谢谢你的帮助

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

它可能会受到线程调度中线程上下文切换的影响。是的,就是这样。基本上有三个线程,具体的执行顺序由调度程序决定。感谢您的帮助。在本例中,我使用print函数来显示程序输出。因此,上下文切换变得更加清晰。我的意思是,如果我们执行一些计算任务,很难实现它。如果我们为具有数据依赖性的任务创建线程,会发生什么?假设我们为函数A和B创建2个线程。函数B将等待A的结果执行。在多线程理论中,多个线程可以并发执行。但在这种情况下,B需要等待A。操作系统如何处理这种情况?操作系统无法处理。作为程序员,处理它是你的工作。操作系统为您提供了同步机制,如信号量,您可以使用它来编写所需的多线程行为。这就是为什么多线程对程序员来说总是一个挑战,不是吗?我们需要保留程序的更正,同时决定程序的哪个部分应该创建一个新线程来提高性能。是的。这是一个挑战,但性能优势使我们转向多线程。对于多核处理器,使用多线程更为重要。今天,您在PC或手机上使用的大多数应用程序都使用多线程。感谢您的帮助。在本例中,我使用print函数来显示程序输出。因此,上下文切换变得更加清晰。我的意思是,如果我们执行一些计算任务,很难实现它。如果我们为具有数据依赖性的任务创建线程,会发生什么?假设我们为函数A和B创建2个线程。函数B将等待A的结果执行。在多线程理论中,多个线程可以并发执行。但在这种情况下,B需要等待A。操作系统如何处理这种情况?这是应用程序程序员处理这种情况的任务。有许多同步功能可用于帮助应用程序程序员获得所需的行为。在本例中,join函数完成该工作
#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