Algorithm 如何使用信号量实现条件变量?
不久前,我在考虑如何实现各种同步原语。例如,在pthread中,您可以获得互斥量和条件变量,并从中构建信号量 在WindowsAPI(或者至少是WindowsAPI的旧版本)中有互斥量和信号量,但没有条件变量。我认为用互斥量和信号量来构建条件变量是可能的,但就我个人而言,我想不出一种方法来实现这一点Algorithm 如何使用信号量实现条件变量?,algorithm,mutex,semaphore,condition-variable,Algorithm,Mutex,Semaphore,Condition Variable,不久前,我在考虑如何实现各种同步原语。例如,在pthread中,您可以获得互斥量和条件变量,并从中构建信号量 在WindowsAPI(或者至少是WindowsAPI的旧版本)中有互斥量和信号量,但没有条件变量。我认为用互斥量和信号量来构建条件变量是可能的,但就我个人而言,我想不出一种方法来实现这一点 有人知道这样做的好方法吗?这里有一个[pdf]正好处理这个问题。实现X给定信号量的一种方法是向系统中添加一个服务器进程,使用信号量与之通信,并让进程完成实现X的所有艰苦工作。作为一个学术练习,这可能
有人知道这样做的好方法吗?这里有一个[pdf]正好处理这个问题。实现X给定信号量的一种方法是向系统中添加一个服务器进程,使用信号量与之通信,并让进程完成实现X的所有艰苦工作。作为一个学术练习,这可能是作弊,但它确实完成了任务,而且对于客户端进程的不当行为或突然死亡,它可能更为健壮。我可能在这里遗漏了一些东西,但似乎有一种比本文中描述的更简单的方法从信号量和锁实现条件
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);
}
嗯,除非“信号量”在Windows API中的含义完全不同,否则它们不是您可以通信的对象。一个进程可以设置信号量,另一个进程可以测试它是否已设置。两台机器可以通过测试和设置两根电线上的电压来传递任意信息。两个进程可以通过测试和设置信号量的状态来传递任意消息。实际上,您可能只会使用信号量来调节对共享内存的访问,但我认为这两种情况都是通信-即使在第二种情况下,您所进行的通信都是“OK-您现在可以读取共享内存”。我认为这基本上是可行的,但从理论上讲,您的最后一个服务员可能会被线程调用信号抢占sem_wait和pthread_mutex_锁之间的时间,这会弄乱您的信号量值。对于所有可能的线程交错,要正确处理这些问题是很困难的代码>并且无法正常工作