linux c多线程优先级

发布时间:2024年01月11日

在 Linux 系统中,可以使用 pthread_setschedparam 函数来设置线程的优先级。该函数需要传入一个指向 pthread_t 类型的线程 ID,以及一个指向 struct sched_param 类型的结构体对象。struct sched_param 结构体包含了线程的优先级信息。

下面是一个示例代码,用于将线程的优先级设置为最高级别:

#include <pthread.h>
#include <sched.h>

void* thread_func(void* arg) {
    // 线程执行的代码
    return NULL;
}

int main() {
    pthread_t thread_id;
    struct sched_param param;
    int policy;

    // 获取当前调度策略
    pthread_getschedparam(pthread_self(), &policy, &param);

    // 设置优先级
    param.sched_priority = sched_get_priority_max(policy);
    pthread_setschedparam(thread_id, policy, &param);

    // 创建线程
    pthread_create(&thread_id, NULL, &thread_func, NULL);

    // 等待线程执行完毕
    pthread_join(thread_id, NULL);

    return 0;
}

需要注意的是,只有具有足够特权的用户才能设置线程的优先级。在 Linux 中,只有 root 用户才能设置线程的实时优先级。其他用户只能设置普通优先级。另外,设置线程优先级需要谨慎,不当的设置可能会影响系统的稳定性和响应性。
在 Linux 中还可以使用 pthread_attr_setschedpolicy 函数来设置线程的调度策略,以及使用 pthread_attr_setschedparam 函数来设置线程的优先级。具体的使用方法如下:

#include <pthread.h>
#include <sched.h>

void* thread_func(void* arg) {
    // 线程执行的代码
    return NULL;
}

int main() {
    pthread_t thread_id;
    pthread_attr_t attr;
    struct sched_param param;

    // 初始化线程属性对象
    pthread_attr_init(&attr);

    // 设置线程的调度策略为 SCHED_FIFO
    pthread_attr_setschedpolicy(&attr, SCHED_FIFO);

    // 设置线程的优先级为最高级别
    param.sched_priority = sched_get_priority_max(SCHED_FIFO);
    pthread_attr_setschedparam(&attr, &param);

    // 创建线程
    pthread_create(&thread_id, &attr, &thread_func, NULL);

    // 等待线程执行完毕
    pthread_join(thread_id, NULL);

    return 0;
}

这种方式比较灵活,可以根据需要灵活地设置线程的调度策略和优先级。需要注意的是,如果要使用实时调度策略(如 SCHED_FIFO 和 SCHED_RR),则需要具有足够的特权或者需要将程序编译为实时程序。
以下是一个简单的示例,演示了在 Linux C 中使用多个线程并设置不同优先级的过程。

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <sched.h>
#include <unistd.h>

#define NUM_THREADS 3

void* thread_func(void* arg) {
    int thread_id = *((int*)arg);
    struct sched_param param;
    int policy;

    // 获取当前调度策略
    pthread_getschedparam(pthread_self(), &policy, &param);
    printf("Thread %d is running with priority %d\n", thread_id, param.sched_priority);

    // 让线程休眠一段时间
    usleep(1000000); // 1秒

    return NULL;
}

int main() {
    pthread_t threads[NUM_THREADS];
    int thread_ids[NUM_THREADS] = {1, 2, 3};

    for (int i = 0; i < NUM_THREADS; i++) {
        pthread_attr_t attr;
        struct sched_param param;

        // 初始化线程属性对象
        pthread_attr_init(&attr);

        // 如果是奇数号线程,则设置为最高优先级
        if (i % 2 == 0) {
            param.sched_priority = sched_get_priority_max(SCHED_FIFO);
            pthread_attr_setschedparam(&attr, &param);
        }

        // 创建线程
        pthread_create(&threads[i], &attr, &thread_func, &thread_ids[i]);
    }

    for (int i = 0; i < NUM_THREADS; i++) {
        // 等待线程执行完毕
        pthread_join(threads[i], NULL);
    }

    return 0;
}

在这个示例中,我们创建了3个线程,并为其中奇数号线程设置了最高优先级。线程执行的函数会通过 pthread_getschedparam 获取当前的调度参数,并打印出线程的优先级。在程序运行时,你可以观察到设置了最高优先级的线程会先执行,然后才是默认优先级的线程。

文章来源:https://blog.csdn.net/weixin_38849487/article/details/135530246
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。