为什么调用 pthread_yield 的父线程不先创建子线程 运行?
Why dosen't the parent thread calling pthread_yield make child threads run first?
这是我的代码。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <sched.h>
void *helper(void *arg)
{
printf("HELPER\n");
return NULL;
}
int main()
{
pthread_t thread;
pthread_create(&thread, NULL, &helper, NULL);
pthread_yield();
// sched_yield();
printf("MAIN\n");
pthread_join(thread, NULL);
return 0;
}
使用pthread_yield()或sched_yield(),输出总是:
MAIN
HELPER
我了解到的两个事实让我假设 HELPER 会在 MAIN 之前打印:
- 调用 pthread_yield 导致调用线程放弃 CPU。 该线程因其静态优先级而被放置在 运行 队列的末尾,并且另一个线程被调度到 运行。 如果调用线程是队列中唯一的线程当时的最高优先级列表,它将继续运行。
- 子线程的创建优先级与父线程相同。
HELPER可能是什么原因在MAIN[=39=之后打印出来的]?
是否 pthread_yield
can/will 做你期望的事情(即首先制作 HELPER 运行)取决于正在使用的系统调度程序及其配置方式。
一般来说,您只能在具有非常简单的调度程序的系统上期待(或者更确切地说希望)这种行为。现代 (Linux) 系统默认情况下会使用更复杂的调度,因此您不能依赖 pthread_yield
来同步执行顺序。
即使 MAIN 停止并启动 HELPER,HELPER 也可以在打印之前被抢占。或者多核 CPU 怎么样?如果两个线程 运行 并行怎么办?谁先打印?
所以 - 不,pthread_yield
不是同步线程的工具。
有关计划的更多信息,请阅读:
https://man7.org/linux/man-pages/man7/sched.7.html
在这里您可以阅读一些系统调用,您可以使用这些系统调用来获取有关调度程序的信息并配置调度程序。
但是为了控制线程的执行顺序,你不应该依赖于控制调度器。实施您自己的控制,例如通过使用 mutex
这是我的代码。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <sched.h>
void *helper(void *arg)
{
printf("HELPER\n");
return NULL;
}
int main()
{
pthread_t thread;
pthread_create(&thread, NULL, &helper, NULL);
pthread_yield();
// sched_yield();
printf("MAIN\n");
pthread_join(thread, NULL);
return 0;
}
使用pthread_yield()或sched_yield(),输出总是:
MAIN
HELPER
我了解到的两个事实让我假设 HELPER 会在 MAIN 之前打印:
- 调用 pthread_yield 导致调用线程放弃 CPU。 该线程因其静态优先级而被放置在 运行 队列的末尾,并且另一个线程被调度到 运行。 如果调用线程是队列中唯一的线程当时的最高优先级列表,它将继续运行。
- 子线程的创建优先级与父线程相同。
HELPER可能是什么原因在MAIN[=39=之后打印出来的]?
是否 pthread_yield
can/will 做你期望的事情(即首先制作 HELPER 运行)取决于正在使用的系统调度程序及其配置方式。
一般来说,您只能在具有非常简单的调度程序的系统上期待(或者更确切地说希望)这种行为。现代 (Linux) 系统默认情况下会使用更复杂的调度,因此您不能依赖 pthread_yield
来同步执行顺序。
即使 MAIN 停止并启动 HELPER,HELPER 也可以在打印之前被抢占。或者多核 CPU 怎么样?如果两个线程 运行 并行怎么办?谁先打印?
所以 - 不,pthread_yield
不是同步线程的工具。
有关计划的更多信息,请阅读:
https://man7.org/linux/man-pages/man7/sched.7.html
在这里您可以阅读一些系统调用,您可以使用这些系统调用来获取有关调度程序的信息并配置调度程序。
但是为了控制线程的执行顺序,你不应该依赖于控制调度器。实施您自己的控制,例如通过使用 mutex