Я пытаюсь создать некоторый код, который будет имитировать голодание нескольких потоков на основе планирования приоритетов (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, ¶m);
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