如何使用信号量实现条件变量?
不久前,我正在考虑如何相互实现各种同步原语。例如,在 pthread 中,您可以获得互斥体和条件变量,并可以从中构建信号量。
在 Windows API(或者至少是旧版本的 Windows API)中,有互斥体和信号量,但没有条件变量。我认为应该可以从互斥体和信号量中构建条件变量,但对于我来说,我就是想不出一种方法来做到这一点。
有谁知道这样做的良好结构?
A while back I was thinking about how to implement various synchronization primitives in terms of one another. For example, in pthreads you get mutexes and condition variables, and from these can build semaphores.
In the Windows API (or at least, older versions of the Windows API) there are mutexes and semaphores, but no condition variables. I think that it should be possible to build condition variables out of mutexes and semaphores, but for the life of me I just can't think of a way to do so.
Does anyone know of a good construction for doing this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
发布评论
评论(2)
我可能在这里遗漏了一些东西,但似乎有一种比论文中描述的方法更简单的方法来从信号量和锁实现条件。
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 的所有艰苦工作。作为一项学术练习,这可能是作弊,但它确实完成工作,并且对于客户端进程的不当行为或突然死亡可能更加稳健。
One way of implementing X given semaphores is to add a server process to the system, use semaphores to communicate with it, and have the process do all the hard work of implementing X. As an academic exercise, this might be cheating, but it does get the job done, and it can be more robust to misbehaviour by the client processes, or to their sudden death.