c - 使用 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 函数的顺序并不是连续发生的。我猜它可能会受到线程调度中的线程上下文切换的影响。我对这个问题的想法对吗?谢谢你的帮助!
解决方案
是的你是对的。正在执行三个线程,由操作系统的调度程序来调度线程并执行上下文切换。因此,每次运行此代码时可能不会得到相同的输出
推荐阅读
- reactjs - Relay QueryRenderer does not return expected props from query
- c# - How to Retrieve Input from Backend Code to HTML OnClick ASP.NET
- leaflet - 使用传单绘制路径
- javascript - PM2 与 Meteor 在部署时出错
- php - 将pdf文件拆分为具有相同外观的多个pdf文件
- python - OpenERP功能使整个系统变慢
- teradata - COLLECT STATS 没有得到真正的价值
- java - 更新查询成功执行,但数据未在 java 中更新
- jquery - 通过jquery中的构造函数设置类属性
- c# - 字典
.Values - 它是否分配新的内存和时间复杂度