Истощение в приоритетном расписании потока путем установки сродства к одному процессору - PullRequest
0 голосов
/ 24 октября 2018

Я пытаюсь создать некоторый код, который будет имитировать голодание нескольких потоков на основе планирования приоритетов (FIFO).Предполагается, что приведенный ниже код устанавливает привязку программы к одному ЦП, чтобы многопоточность не возникала, затем я порождаю все потоки с разными приоритетами и жду секунду, чтобы убедиться, что все они настроены и находятся в состоянии ожидания послекоторый я освобождаю мьютексом и из-за политики планирования 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 (подсистему Windows для Linux), и мне было интересно, не вызвало ли это мою проблему как сходствонастройка - это вещь linux, которая в нем может некорректно переводиться?

команда сборки
$gcc -o main main.c -pthread -std=gnu99 -D_GNU_SOURCE
команда запуска (sudo из-за изменения приоритетов)
$sudo ./main

...