2015-05-29 3 views
-1

Я написал следующий код для знаменитой проблемы с спальным барьером, но теперь я обнаружил, что мне приходилось использовать файлы с отображением памяти вместо глобальных переменных. Как я могу это сделать? Я понятия не имею о файлах с отображением памяти.с использованием файлов с отображением памяти для глобальных переменных

#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <pthread.h> 
#include <semaphore.h> 
#define MAX_CUSTOMERS 5 

void *customer(void *num); 
void *barber(void *); 

// CWait is used to make the customer to wait until the barber is done cutting his/her hair. 
sem_t CWait; 
// waitingRoom Limits the # of customers allowed to enter the waiting room at one time. 
sem_t waitingRoom; 
// barberChair ensures mutually exclusive access to the barber chair. 
sem_t barberChair; 
// barberPillow is used to allow the barber to sleep until a customer arrives. 
sem_t barberPillow; 

// Flag to stop the barber thread when all customers have been serviced. 
int allDone = 0; 

int main(int argc, char *argv[]) 
{ 
    pthread_t btid; 
    pthread_t tid[MAX_CUSTOMERS]; 
    int i, numChairs; 
    int Number[MAX_CUSTOMERS]; 


    numChairs = MAX_CUSTOMERS;  //number of chairs will be equal to max num of costumers 

    printf("A solution to the sleeping barber problem using semaphores.\n"); 
    for (i = 0; i < MAX_CUSTOMERS; i++) { 
     Number[i] = i; 
    } 

    sem_init(&waitingRoom, 0, numChairs); 
    sem_init(&barberChair, 0, 1); 
    sem_init(&barberPillow, 0, 0); 
    sem_init(&CWait, 0, 0); 

    // Create the barber. 
    pthread_create(&btid, NULL, barber, NULL); 

    // Create the customers. 
    for (i = 0; i < MAX_CUSTOMERS; i++) { 
     pthread_create(&tid[i], NULL, customer, (void *)&Number[i]); 
    } 
    // Join each of the threads to wait for them to finish. 
    for (i = 0; i < MAX_CUSTOMERS; i++) { 
     pthread_join(tid[i],NULL); 
    } 
    // When all of the customers are finished, kill the barber thread. 
    allDone = 1; 
    sem_post(&barberPillow); // Wake the barber so he will exit. 
    pthread_join(btid,NULL); 

    return 0; 
} 

void *customer(void *number) { 
    int num = *(int *)number; // Leave for the shop and take some random amount of time to arrive. 
    sleep(1); 
    printf("Customer %d arrived at barber shop.\n", num); // Wait for space to open up in the waiting room... 
    sem_wait(&waitingRoom); 
    printf("Customer %d entering waiting room.\n", num); // Wait for the barber chair to become free. 
    sem_wait(&barberChair); // The chair is free so give up your spot in the waiting room. 
    sem_post(&waitingRoom); // Wake up the barber... 
    printf("Customer %d waking the barber.\n", num); 
    sem_post(&barberPillow); // Wait for the barber to finish cutting your hair. 
    sem_wait(&CWait); // Give up the chair. 
    sem_post(&barberChair); 
    printf("Customer %d leaving barber shop.\n", num); 
} 

void *barber(void *junk) 
{ 
// While there are still customers to be serviced... Our barber is omniscient and can tell if there are customers still on the way to his shop. 

    while (!allDone) { // Sleep until someone arrives and wakes you.. 
    printf("The barber is sleeping\n"); 
    sem_wait(&barberPillow); // Skip this stuff at the end... 
    if (!allDone) 
    { // Take a random amount of time to cut the customer's hair. 
    printf("The barber is cutting hair\n"); 
    sleep(1); 
    printf("The barber has finished cutting hair.\n"); // Release the customer when done cutting... 
    sem_post(&CWait); 
    } 
    else { 
     printf("The barber is going home for the day.\n"); 
    } 
    } 
} 
+0

Немного педантичный, но правильное написание «всеведущее»! – PJTraill

ответ

0

Использование файлов с отображением памяти для совместного использования в рамках отдельных процессов является немного странным, но, безусловно, выполнимым.

Предположим, вам нужно предоставить переменную чтения-записи типа some_type_t с именем var_name.

Сначала используйте shm_open вызов:

var_fd = shm_open("var_name", O_CREAT, S_IRUSR | S_IWUSR) 

Это создает новый дескриптор файла для нашей переменной.

Далее мы выделяем пространство для переменной:

some_type_t * var_ptr;

var_ptr = mmap(NULL, sizeof(some_type_t), PROT_READ | PROT_WRITE, MAP_PRIVATE, var_fd, 0); 

Теперь вы можете получить доступ к переменной через *var_ptr; например *var_ptr = 42

Вы даже можете пропустить shm_open вызов и просто сделать:

var_ptr = mmap(NULL, sizeof(some_type_t), PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, 0, 0) 

я ушел из проверки ошибок и deallocating переменного, как только вы закончите.

Смежные вопросы