2012-02-14 5 views
1

私はマルチスレッドプログラミングの初心者ですが、これは単純すぎると思わないでください。Boost、Mutex、クラスメンバ、共有オブジェクトメンバ

私は、例えば、

class XYZ 
{ 
public: 
int a; 
int b; 
... 
}; 

xyzは、複数のスレッド間で共有オブジェクトで、いくつかのメンバ変数を持つ単純なクラスのオブジェクトを持っている、「」複数のスレッド間で共有するための最良の方法は何ですか?たとえば、スレッドAで

は、私は、スレッドBで

xyz.a = xyz.a + rand(); 

ような何かをしますが、私は、私はおよそクラスのメンバーとしてミューテックスを作成聞い

xyz.a = xyz.a - rand(); 

ような何かをします誰かが簡単な例を与えることができますか?

複数のスレッドがメンバーに安全にアクセスできるようにするクラスインターフェイスを作成するにはどうすればよいですか?

+0

に使う「どのように私は複数のスレッドが安全にそのメンバーにアクセスすることを可能にするクラス・インターフェースを作成することができますか?」 – 2607

答えて

1

あなたはミューテックスを使用することができます。それらは同時に1つのスレッドだけでロックすることができます。

class XYZ 
{ 
    int a,b; 
    boost::mutex mutex; 
} 

は、その後、私はと私は質問を言い換えることができますねスレッドコード

void thread(XYZ *xyz) 
{ 
    //.... 

    // now a member of xyz should be accessed/changed. 
    { 
    boost::unique_lock<boost::mutex> lock(xyz->mutex); // lock first the mutex 
    // do something with members of xyz 
    // ... 
    } // mutex automatically freed because lock object destroyed 

    //... 
} 
+0

johfel、お返事ありがとうございます。 aとbの両方を自動的にロックしますか?どのように私は以下を達成するには threadA、ロックするだけです。 スレッドB、ロックのみb。おかげさまで – 2607

+0

2つのミューテックスオブジェクトを使用してください。ミューテックスは、何かを直接ロックしません。 1つのスレッドだけで同時にロックすることができるので、必要なものへのアクセスを制御するために使用できます。 – jofel

1

ポインタを使用している場合は、boost::shared_ptr<O>(ここでOはポインタのオブジェクトクラス)を使用できます。

それらのint型の場合は、あなたが使用できます。boost:atomic<int>

関連する問題