pthread_yield无法在线程之间正确循环

pthread_yield doesn't properly cycle between threads

本文关键字:之间 循环 线程 yield pthread      更新时间:2023-10-16

我有三个函数A,B,C,我想用于线程。我想运行它们一定次数的迭代,并希望在每次迭代时在它们之间切换。我在使用 pthread_yield(( 时它们的执行顺序有问题

下面是这些函数的代码

void *A(void *arg){
int i = 0;
for (i=0; i < 3; i++){
printf("Hello A%dn", i);
pthread_yield();
}
}
void *B(void *arg){
int i = 0;
for(i=0; i < 3; i++){
printf("Hello B%dn", i);
pthread_yield();
}
}
void *C(void *arg){
int i = 0;
for(i=0; i < 3; i++){
printf("Hello C%dn", i);
pthread_yield();
}
}

这是我的主函数的代码,我在其中制作线程

int main(){
pthread_t threadId_1, threadId_2, threadId_3;
printf("Before Threadn"); 
pthread_create(&threadId_1, NULL, A, NULL); 
pthread_create(&threadId_2, NULL, B, NULL); 
pthread_create(&threadId_3, NULL, C, NULL); 
// This line is Equivalent to Sleep // pthread_join(threadId_1, NULL); 
//pthread_join(threadId_2, NULL);
//pthread_join(threadId_3, NULL);
sleep(1);
printf("After Threadn");
}

当我运行程序时,我得到以下输出:

Before Thread
Hello C0
Hello B0
Hello C1
Hello B1
Hello C2
Hello B2
Hello A0
Hello A1
Hello A2
After Thread

而不是这个我想要

Before Thread
Hello A0
Hello B0
Hello C0
Hello A1
Hello B1
Hello C1
Hello A2
Hello B2
Hello C2
After Thread

如果我不使用pthread_yield,我最后创建的线程将首先完成,然后是倒数第二个线程,首先创建的线程将最后完成。 为什么会这样?

另外,当我使用 pthread_yield 时,为什么程序在完成执行然后移动到线程 A 之前在最后两个创建的线程 B 和 C 之间交替?

如何在线程 A、B、C 之间完美交替的情况下实现我想要的输出?

man pthread_yield

导致调用线程放弃 CPU。 该线程被放置在运行队列的末尾,以实现其静态优先级,另一个线程被安排运行。如果调用线程是当时优先级最高的列表中的唯一线程,它将继续运行。

换句话说,pthread_yield并不能保证挂起线程。因此,它不能帮助排序或序列化线程的执行。对于您的任务来说,这是一个错误的工具。


我有三个函数 A、B、C,我想用于线程。我想运行它们一定次数的迭代,并希望在每次迭代时在它们之间切换。

一种解决方案是让一个线程依次运行函数 A、B 和 C。

另一种解决方案可能是将线程固定到同一 CPU 并分配实时 FIFO 优先级,以便pthread_yield切换到另一个等待在同一 CPU 上运行的 FIFO 实时线程。但是,在这种情况下,并行性丢失,首先违背了拥有多个线程的目的。