Algorithm 如何使用信号量实现条件变量?

Algorithm 如何使用信号量实现条件变量?,algorithm,mutex,semaphore,condition-variable,Algorithm,Mutex,Semaphore,Condition Variable,不久前,我在考虑如何实现各种同步原语。例如,在pthread中,您可以获得互斥量和条件变量,并从中构建信号量 在WindowsAPI(或者至少是WindowsAPI的旧版本)中有互斥量和信号量,但没有条件变量。我认为用互斥量和信号量来构建条件变量是可能的,但就我个人而言,我想不出一种方法来实现这一点 有人知道这样做的好方法吗?这里有一个[pdf]正好处理这个问题。实现X给定信号量的一种方法是向系统中添加一个服务器进程,使用信号量与之通信,并让进程完成实现X的所有艰苦工作。作为一个学术练习,这可能

不久前,我在考虑如何实现各种同步原语。例如,在pthread中,您可以获得互斥量和条件变量,并从中构建信号量

在WindowsAPI(或者至少是WindowsAPI的旧版本)中有互斥量和信号量,但没有条件变量。我认为用互斥量和信号量来构建条件变量是可能的,但就我个人而言,我想不出一种方法来实现这一点


有人知道这样做的好方法吗?

这里有一个[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_锁之间的时间,这会弄乱您的信号量值。对于所有可能的线程交错,要正确处理这些问题是很困难的并且无法正常工作