【发布时间】:2021-07-23 11:05:55
【问题描述】:
这是我的代码。
#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之后可能是什么原因?
【问题讨论】:
-
线程不按任何明确定义的顺序运行,它们彼此并行运行。因此,除非您同步它们的行为,否则线程将按什么顺序运行取决于操作系统,尽管有
pthread_yield()调用。 -
sched_yield()(POSIX 标准)和pthread_yield()(非标准)的文档带有大量警告,说明它在某些实时调度程序情况下的使用方式以及在具有正常调度程序的进程没有很好地定义。它可能做你想做的事,但不做同样有效。
标签: c multithreading pthreads