Как вы можете реализовать условную переменную, используя семафоры? - PullRequest
7 голосов
/ 19 марта 2011

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

В Windows API (или, по крайней мере, в более старых версиях Windows API) есть мьютексы и семафоры, но нет условных переменных. Я думаю, что можно создать условные переменные из мьютексов и семафоров, но я не могу придумать, как это сделать.

Кто-нибудь знает хорошую конструкцию для этого?

Ответы [ 3 ]

10 голосов
/ 20 марта 2011

Вот документ от Microsoft Research [pdf], который посвящен именно этому.

1 голос
/ 24 февраля 2013

Возможно, я что-то здесь упускаю, но, кажется, существует более простой способ реализации Условия из Семафора и Замка, чем способ, описанный в статье.

class Condition {
    sem_t m_sem;
    int   m_waiters;
    int   m_signals;
    pthread_mutex_t *m_mutex;
public:

    Condition(pthread_mutex_t *_mutex){
        sem_init(&this->m_sem,0,0);
        this->m_waiters = 0;
        this->m_signals = 0;
        this->m_mutex = _mutex;
    }
    ~Condition(){}
    void wait();
    void signal();
    void broadcast();
};

void Condition::wait() {
    this->m_waiters++;
    pthread_mutex_unlock(this->m_mutex);
    sem_wait(&this->m_sem);
    pthread_mutex_lock(this->m_mutex);
    this->m_waiters--;
    this->m_signals--;
}

void Condition::signal() {
    pthread_mutex_lock(this->m_mutex);
    if (this->m_waiters && (this->m_waiters > this->m_signals)) {
        sem_post(&this->m_sem);
        this->m_signals++;
    }
    pthread_mutex_unlock(this->m_mutex);
}
0 голосов
/ 20 марта 2011

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

...