pthread_yield无法在线程之间正确循环
pthread_yield doesn't properly cycle between threads
我有三个函数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 实时线程。但是,在这种情况下,并行性丢失,首先违背了拥有多个线程的目的。
相关文章:
- 基于范围的 for 循环range_declaration中各种说明符之间的性能差异
- 当数组位于两个循环之间时,您可以调用数组的 void 函数吗?
- 为什么 for 循环和 while 循环之间的 continue 不同?
- C++ 中的类之间的数据重新循环 - 错误:'<class name>'未在此范围内声明
- C++ if 语句将条件设置为 true 和循环中的 OR-ing 条件之间的行为差异
- pthread_yield无法在线程之间正确循环
- matlab 和 c++ 中的 while 循环之间的区别
- 我是否应该避免在循环中的常数之间进行操作
- 在 C 中并行化嵌套循环的几种方法之间的差异,C++使用 OpenMP
- 符号和未签名整数表达式之间的比较,以进行循环误差
- OPENCV MAT问题:直方图和此循环之间的差异
- 三个数字之间的 C++ 相加两个更高的数字,没有循环和数组
- 开放MP;嵌套循环之间的操作
- 本应生成 2 个介于 1 和 9 之间的随机数的程序C++只生成 6 和 9 并且没有正确循环
- OpenMP 嵌套循环,每个"for"循环之间都有代码
- 在基于范围的 for 循环中,& 和 && 之间有什么区别?
- 逗号(,)在条件部分中两个表达式之间的for循环中的工作方式
- 使用嵌入循环查找1-239之间的素数
- 有没有一种方法可以在变量之间循环?(C++)
- 应用程序中库之间循环依赖的影响