Имитация кругового робина с нитями - PullRequest
2 голосов
/ 26 марта 2012

Задача состоит в том, чтобы одновременно присутствовало 5 потоков, и каждый пользователь назначает каждому пакетное время. Затем алгоритм циклического алгоритма с квантом 2 используется для планирования потоков. Например, если я запускаю программу с

$ ./m 1 2 3 4 5

Вывод должен быть

A 1
B 2
C 2
D 2
E 2
C 1
D 2
E 2
E 1

Но пока мой вывод показывает только

A 1
B 2
C 2

Поскольку программа ошибается, когда один поток на данный момент не заканчивается, я думаю, проблема в том, что этот поток не может разблокировать, чтобы позволить следующему потоку захватить блокировку. Мой сон () тоже не работает. Но я понятия не имею, как изменить мой код, чтобы исправить их. Мой код выглядит следующим образом:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
double times[5];
char process[] = {'A', 'B', 'C', 'D', 'E'};
int turn = 0;

void StartNext(int tid)     //choose the next thread to run
{
    int i;
    for(i = (tid + 1) % 5; times[i] == 0; i = (i + 1) % 5)
        if(i == tid)    //if every thread has finished
            return;
    turn = i;
}

void *Run(void *tid)    //the thread function
{
    int i = (int)tid;
    while(times[i] != 0)
    {
        while(turn != i);   //busy waiting till it is its turn
        if(times[i] > 2)
        {
            printf("%c 2\n", process[i]);
            sleep(2);   //sleep is to simulate the actual running time
            times[i] -= 2;
        }
        else if(times[i] > 0 && times[i] <= 2)      //this thread will have finished after this turn
        {
            printf("%c %lf\n", process[i], times[i]);
            sleep(times[i]);
            times[i] = 0;
        }
        StartNext(i);   //choose the next thread to run
    }
    pthread_exit(0);
}

int main(int argc, char **argv)
{
    pthread_t threads[5];
    int i, status;

    if(argc == 6)
    {
        for(i = 0; i < 5; i++)
            times[i] = atof(argv[i + 1]);   //input the burst time of each thread
        for(i = 0; i < 5; i++)
        {
            status = pthread_create(&threads[i], NULL, Run, (void *)i);    //Create threads
            if(status != 0)
            {
                printf("While creating thread %d, pthread_create returned error code %d\n", i, status);
                exit(-1);
            }
            pthread_join(threads[i], 0);    //Join threads
        }
    }
    return 0;
}

Программа запускается напрямую. Может ли кто-нибудь помочь мне разобраться? Спасибо!

1 Ответ

1 голос
/ 26 марта 2012

Некоторые вещи, которые я понял, читая твой код:

1. В начале функции Run вы конвертируете tid (который является указателем на void) непосредственно в int. Разве вы не должны разыменовывать это?

  1. Лучше, чтобы int превращался в энергозависимый, чтобы компилятор не делал никаких предположений о том, что его значение не меняется.

  2. Когда вы вызываете функцию sleep второй раз, вы передаете параметр, имеющий тип double (times [i]), и вам следует передать параметр unsigned int. Это должно решить прямое приведение типа (unsigned int) times[i].

  3. Вы делаете pthread_join до создания других потоков. Когда вы создаете поток 3, и он входит в состояние ожидания занятости, другие потоки не будут созданы. Попробуйте поместить соединения после блока for.

...