Использование именованного семафора для синхронизации между процессами - PullRequest
0 голосов
/ 19 февраля 2020

Я пытаюсь реализовать модифицированную форму классической c проблемы столовых философов.

Предположим, на столе сидят 5 философов. На столе размещены 3 вилки и 3 ложки. Философ может выбрать любую ложку или вилку на столе. Философу нужны вилка и ложка, чтобы поесть.

Я представляю каждого философа процессом. Я использую два семафора с именами: semf и semt, представляющие вилку и ложку соответственно.

Процесс не синхронизируется. Простой способ продемонстрировать это - иметь двух философов и предоставить одну ложку и вилку.

Вот код:

#include <stdio.h>         
#include <stdlib.h>       
#include <sys/types.h>        
#include <errno.h>          
#include <semaphore.h>      
#include <fcntl.h>          

#define SEFORK "/eatingforksem"
#define SSPOON "/spoonsem"


int main()
{
    int i;                       
    pid_t pid;
    unsigned int n;             
    unsigned int fvalue;     
    unsigned int svalue;        

    printf ("How many Philosophers are sitting on the table?\n");
    printf ("Philosopher count: ");
    scanf ("%u", &n);

    printf ("Count of Eating Forks?\n");
    printf ("Eating Fork Count: ");
    scanf ("%u", &fvalue);

    printf ("Count of Eating Spoons?\n");
    printf ("Eating Spoon Count: ");
    scanf ("%u", &svalue);    


    sem_t *semf = sem_open(SEFORK, O_CREAT, 0644, fvalue); 
    sem_t *sems = sem_open(SSPOON, O_CREAT, 0644, svalue); 
    printf ("semaphores initialized.\n\n");


    for (i = 0; i < n; i++){
        pid = fork ();
        if (pid < 0) {
            sem_unlink (SEFORK);   
            sem_unlink (SSPOON);               
            sem_close(semf);  
            sem_close(sems);  
            printf ("Fork error.\n");
        }
        else if (pid == 0)
            break;                  /* child processes */
    }


    if (pid != 0){
        while (pid = waitpid (-1, NULL, 0)){
            if (errno == ECHILD)
                break;
        }

        sem_unlink (SEFORK);   
        sem_unlink (SSPOON);               
        sem_close(semf);  
        sem_close(sems);
        printf ("\nParent: All Philosphers have eaten.\n");

        exit (0);
    }
    else{

        sem_t *semf = sem_open(SEFORK, 0); 
        sem_t *sems = sem_open(SSPOON, 0); 
        printf(" Philosopher %d is thinking\n", i);
        sleep (3);
        printf(" Philosopher %d is hungry\n", i);
        sleep (3);                                           
        sem_wait (semf);
        printf(" Philosopher %d has picked a fork\n", i);
        sleep (3);           
        sem_wait (sems);
        printf(" Philosopher %d has picked a spoon and is eating\n", i);   
        sleep (3);
        sem_post (semf); 
        printf(" Philosopher %d has put down the fork\n", i);                    
        sem_post (sems);                           
        printf(" Philosopher %d has put down the spoon and finished eating\n", i); 
        sleep (3);          
        exit (0);
    }    


    return 0;
}

Я компилирую программу, используя g cc с флаги -lpthread -lrt -pthread.

...