Как я могу кодировать монитор в C? - PullRequest
7 голосов
/ 30 сентября 2010

Мне нужно выполнить некоторую синхронизацию процессов в C. Я хочу использовать монитор, и я много о них читал.Однако я не смог выяснить, как реализовать один на C. Я видел, как они сделаны на Java и других языках, таких как C ++, но я не могу найти примеры на C.

Я просмотрел K & R итам нет примера.Я пролистал Unix Systems Programming, Communication, Concurrency и Threads, но не смог найти там реализацию монитора.

Это приводит меня сюда.Где и как я могу определить монитор?Как мне реализовать это в остальной части кода?

/ * Я кодирую в среде * nix * /

Ответы [ 2 ]

5 голосов
/ 30 сентября 2010

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

Концепция монитора в контексте шаблона проектирования монитора представляет собой конструкцию, которая в основном предназначена для того, чтобы скрыть взаимное исключение. Эта концепция выражена в C ++ Boost, но она не существует в ядре C ++ или C. То, как вы выполняете этот тип работы в C, заключается в использовании старых добрых мьютексов (двоичных семафоров) и семафоров. Вы можете прочитать больше об этом здесь .

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

pthread_mutex_t myMutex;
sem_t mySemaphore;
int status;
    status = pthread_mutex_init(&myMutex, NULL);
    if(status != 0)
        exit_with_error("There was an Error Initalizing the Mutex\n");
    status = sem_init(&mySemaphore, 0, 0);
    if(status != 0)
        printf("There was an Error Initalizing the Semaphore\n");
2 голосов
/ 01 мая 2018

Приведенный выше код для инициации семафора и мьютекса великолепен.Вот пример того, как использовать его в программе, которая может иметь ошибки при многопоточности.

struct account{
        int balance;
        int finished;
        pthread_mutex_t mutex;
        pthread_cond_t deposit; 
};

static void init_account(struct account *act)
{
        act->balance = 0;
        act->finished = 0;
        pthread_mutex_init(&act->mutex,NULL);
        pthread_cond_init(&act->deposit,NULL);
}

static void deposit(struct account *act, int amount)
{
        pthread_mutex_lock(&act->mutex);
        fprintf(stderr, "Deposit:%d\n",amount);
        act->balance += amount;
        pthread_cond_broadcast(&act->deposit);
        pthread_mutex_unlock(&act->mutex);
}
...