1、创建线程时设置调度策略及优先级
如下示例(结合注释)足够说明如何在创建线程时设置调度策略及优先级
#include <pthread.h>
#include <sched.h>
#include <stdio.h>
#include <stdlib.h>
void *thread_function(void *arg) {
// 线程执行的代码
printf("Hello from thread!\n");
return NULL;
}
int main() {
pthread_t thread_id;
pthread_attr_t attr;
struct sched_param param;
int policy;
// 初始化线程属性
if (pthread_attr_init(&attr) != 0) {
perror("pthread_attr_init");
exit(EXIT_FAILURE);
}
// 设置调度策略
// SCHED_FIFO: 先进先出调度策略
// SCHED_RR: 轮转调度策略
// SCHED_OTHER: 默认调度策略
policy = SCHED_FIFO; // 或者使用 SCHED_RR
if (pthread_attr_setschedpolicy(&attr, policy) != 0) {
perror("pthread_attr_setschedpolicy");
exit(EXIT_FAILURE);
}
// 设置调度参数
// 对于 SCHED_FIFO 和 SCHED_RR,需要设置优先级
// 对于 SCHED_OTHER,此参数无效
param.sched_priority = 1; // 优先级值依赖于系统和策略
if (pthread_attr_setschedparam(&attr, ¶m) != 0) {
perror("pthread_attr_setschedparam");
exit(EXIT_FAILURE);
}
// 创建线程,传递自定义属性
if (pthread_create(&thread_id, &attr, thread_function, NULL) != 0) {
perror("pthread_create");
exit(EXIT_FAILURE);
}
// 等待线程结束
if (pthread_join(thread_id, NULL) != 0) {
perror("pthread_join");
exit(EXIT_FAILURE);
}
// 销毁线程属性对象
pthread_attr_destroy(&attr);
return 0;
}
要使用此功能需检查系统的实时调度是否启用
2、内核及启动参数配置
想要使用上述功能,需在编译内核源码时启用与实时调度相关选项。
使用make menuconfig,make defconfig 等工具配置
空格勾选
make ARCH=arm64 nanopi4-images -j8 //编译源码指令(这里编译选择arm64平台可根据不同需求自行选择)