Я пытаюсь создать код, который будет имитировать нехватку нескольких потоков на основе планирования приоритетов (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
@MartinJames просто хотел сказать, что теперь я подтвердил, что это WSL. Я установил Ubuntu и запустил программу. работа без sudo дает то же поведение, что и на WSL, работа с sudo, и, как и предполагалось, программа умирает от голода, и только поток с приоритетом 40 может печатать
Потоки почти ничего не делают, кроме вызовов ввода-вывода printf (). Вызов ввода-вывода printf () имеет блокировку мьютекса для защиты выходного потока от множественного доступа. У блокировки есть очередь для потоков, ожидающих мьютекса. Я подозреваю, что потоки могут стоять в очереди на блокировку. В этом случае прямой прогресс не ограничивается и не управляется приоритетом ЦП. Но не публиковать это как ответ :)