2009-06-07 5 views
0

私はマルチスレッドとロックに対する多くの種類のインターフェイスを見てきました。このインターフェイスを操作する方法は?

これらは)私が

他は(唯一のクラスと取得を持っている間、それらのいくつかは、以下のサンプルのような2つの異なるクラスが含まれ、

をイライラ感じさせるウェイト機能を実装することができます。

私の質問は次のとおりです: なぜオブジェクト指向プログラミングでこのようなロックを設計するのですか?

このようなオブジェクトを操作するにはどうすればよいですか?

class Lock 
{ 
public: 
    Lock(); 
    ~Lock(); 

    // Acquire the lock. 
    void 
    acquire() 
    { this->lock_->acquire(); } 

    // Release the lock. 
    void 
    release() 
    { this->lock_->release(); } 

    private: 
    // This class can not be copied. 
    Lock(const Lock&); 
    Lock& operator=(const Lock&); 

    friend class Condvar; 
    Lock_impl* 
    get_impl() const 
    { return this->lock_; } 

    Lock_impl* lock_; 
}; 

class Condvar 
{ 
public: 
    Condvar(Lock& lock); 
    ~Condvar(); 
    // Wait for the condition variable to be signalled. This should 
    // only be called when the lock is held. 
    void 
    wait() 
    { this->condvar_->wait(this->lock_.get_impl()); } 

    // Signal the condition variable--wake up at least one thread 
    // waiting on the condition variable. This should only be called 
    // when the lock is held. 
    void 
    signal() 
    { this->condvar_->signal(); } 

    // Broadcast the condition variable--wake up all threads waiting on 
    // the condition variable. This should only be called when the lock 
    // is held. 
    void 
    broadcast() 
    { this->condvar_->broadcast(); } 

    private: 
    // This class can not be copied. 
    Condvar(const Condvar&); 
    Condvar& operator=(const Condvar&); 

    Lock& lock_; 
    Condvar_impl* condvar_; 
}; 

答えて

1

上記はロックと条件変数です。
これらは2つのユニークな概念です。

ロックは単なるアトミックロックオンまたはオフです。

条件変数(正しく使用するのがはるかに難しい)で、正しく実装するにはロックが必要ですが、状態(基本的にはカウント)を維持します。

は、「条件変数」の詳細については以下を参照してください
http://en.wikipedia.org/wiki/Monitor_(synchronization)

は、基本的には条件変数は「モニター」(別名モニタ領域)を作成するために使用される低レベルのプリミティブです。モニタは、複数のスレッドで使用されるように設計されたコードの領域です(通常は制御された数(単純な場合は1つ))が、マルチスレッドで安全です。

以下に「条件変数」の良い例を示します。
How to implement blocking read using POSIX threads

基本的に、モニタ領域には2つのスレッドが許可されています。スレッドはベクトルから読み込み中で、第2のスレッドはベクトルから起きています。 'モニタ'は、2つのスレッド間の相互作用を制御します。ロックを使っても同じ効果が得られますが、正しく行うのはずっと/はるかに困難です。

1

ロックの目的は、2つの異なる処理スレッドが同じメモリ位置を同時に変更しないようにすることです。

スレッドがコード領域をロックし、2番目のスレッドが同じコード領域に入ると、2番目のスレッドはコードを実行する前に最初のスレッドがロックを解除するのを待ちます。

関連する問題