通过将亲和力设置为单个CPU来优先线程调度中的饥饿

时间:2018-10-24 06:34:06

标签: c linux-kernel scheduling windows-subsystem-for-linux affinity

我正在尝试创建一些代码,这些代码将基于优先级调度(FIFO)模拟多个线程的饥饿状态。下面的代码应该将程序亲和力设置为单个CPU,这样就不会发生多线程处理,然后生成具有不同优先级的所有线程,并等待一秒钟以确保它们都已设置并在之后处于等待状态我释放了互斥锁,并且由于FIFO调度策略,具有最高优先级的线程应该能够继续运行,然后永远使其他2个线程饿死。这是我的代码...

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

//global variables
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

void* tfun(void*n){
    struct sched_param param;
    int num_runs = 20;

    //set priority
    param.sched_priority = (int) n;
    sched_setscheduler(0, SCHED_FIFO, &param);

    pthread_mutex_lock(&mutex);
    pthread_cond_wait(&cond, &mutex);
    pthread_mutex_unlock(&mutex);

    while(num_runs) {
            printf("thread priority: %d\n", (int) n);
            //num_runs = num_runs -1;
    }

    return NULL;
}

int main(int argc, char* argv[])       
{
    pthread_t tid1, tid2, tid3;
    cpu_set_t cpus;

    CPU_ZERO(&cpus);
    CPU_SET(0, &cpus);
    sched_setaffinity(0, sizeof(cpu_set_t), &cpus);

    pthread_create(&tid1, NULL, tfun, (void *) 40);
    pthread_create(&tid2, NULL, tfun, (void *) 30);
    pthread_create(&tid3, NULL, tfun, (void *) 20);

    sleep(1);
    pthread_mutex_lock(&mutex);
    pthread_cond_broadcast(&cond);
    pthread_mutex_unlock(&mutex);

    pthread_join(tid1, NULL);
    pthread_join(tid2, NULL);
    pthread_join(tid3, NULL);

    return 0;
}

当我运行它时,并没有使我的预期行为“线程优先级:40”无休止地打印,而是似乎在所有不同线程之间循环并也将它们打印出来。

我不确定我的代码是否有问题,但是我使用的是WSL(Linux的Windows子系统),我想知道是否可能引起我的问​​题,因为亲和力设置是Linux的事情,不能正确翻译吗?

构建命令
$gcc -o main main.c -pthread -std=gnu99 -D_GNU_SOURCE
运行命令(须藤,因为更改优先级)
$sudo ./main

0 个答案:

没有答案