7

しばらく前に、さまざまな同期プリミティブを相互に実装する方法について考えていました。たとえば、pthreads ではミューテックスと条件変数を取得し、これらからセマフォを構築できます。

Windows API (または少なくとも Windows API の古いバージョン) にはミューテックスとセマフォがありますが、条件変数はありません。ミューテックスとセマフォから条件変数を構築することは可能だと思いますが、私の人生では、そうする方法が思い浮かびません。

これを行うための良い構造を知っている人はいますか?

4

3 に答える 3

10

これは、まさにそれを扱っているMicrosoftResearch[pdf]の論文です。

于 2011-03-19T21:06:25.787 に答える
0

ここで何かが足りないかもしれませんが、このペーパーで説明されている方法よりも、セマフォとロックから条件を実装する簡単な方法があるようです。

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);
}
于 2013-02-23T20:38:16.023 に答える
0

セマフォを指定して X を実装する 1 つの方法は、サーバー プロセスをシステムに追加し、セマフォを使用してそれと通信し、X を実装するためのすべてのハードワークをプロセスに行わせることです。ジョブを完了すると、クライアント プロセスによる不正な動作や突然の終了に対してより堅牢になります。

于 2011-03-20T05:51:33.090 に答える