Как можно реализовать переменную условия с помощью семафоров?
некоторое время назад я думал о том, как реализовать различные примитивы синхронизации в терминах друг друга. Например, в pthreads вы получаете мьютексы и условные переменные, и из них можно строить семафоры.
в API Windows (или, по крайней мере, в более старых версиях API Windows) есть мьютексы и семафоры, но нет переменных условий. Я думаю, что должно быть возможно построить переменные состояния из мьютексов и семафоров, но для жизни меня я просто не могу придумать, как это сделать.
кто-нибудь знает хорошую конструкцию для этого?
4 ответов
здесь бумага из Microsoft Research [pdf], который имеет дело именно с этим.
Я могу что-то пропустить здесь, но, похоже, есть более простой способ реализовать условие из семафора и блокировки, чем описанный в статье.
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);
}
один из способов реализации X данных семафоров-добавить серверный процесс в систему, использовать семафоры для связи с ним и заставить процесс выполнять всю тяжелую работу по реализации X. В качестве академического упражнения это может быть обманом, но он выполняет работу, и он может быть более надежным для плохого поведения клиентских процессов или их внезапной смерти.
проверьте этот документ: https://birrell.org/andrew/papers/ImplementingCVs.pdf
TL; DR: используйте явную очередь.