2011-01-30 1 views
1

多くのインスタンスを持つC++クラスがあり、アプリケーションスレッドを安全にしたい。 このクラスは、例えば、部材及びそれを処理する関数があります。マルチスレッドアクセスのクラスインスタンスを保護する

class MyCls { 
    int x; 
    void f() { x++; } 
}; 

私はそう限り、私はそれを見て、私は2つのオプションがあり、このメンバーを保護する必要があります。

  1. を追加しますグローバルクリティカルセクションと このメンバーに触れる前にそれを入力してください。
  2. クラス にクリティカルセクションを追加し、各インスタンスがそれ自身のメンバーを保護するようにします。

どちらのソリューションは、巨大overkillsです:

  1. 2つの異なるインスタンスは全く同期すべきではありません。
  2. OSは、実際に衝突が非常に少ない数百万のクリティカルセクションを処理する必要があります。

私が使用できる別のソリューションまたはマルチスレッドデザインパターンはありますか?

+0

特別な初期化をまったく必要とせず、スレッドがブロックしている間だけリソースを消費するロックがあります。たとえば、ここにMicrosoftのものがあります。http://msdn.microsoft.com/en-us/library/aa904937.aspx – wj32

+0

コードの書式設定に4つのインデントを使用してください。 –

+0

この質問のCタグはなぜですか? – Mandrake

答えて

2

わかりませんが、私はこの問題がSoftware transactional memoryメカニズムを使用することで解決できると思います。 implementations for C++の束があります。

+0

STMは、他のメカニズム(ロック、ミューテックス、セマフォなど)とは対照的に構成可能です。[トランザクションのメモリに関する論文](http://research.microsoft.com)を参照してください。Haskellプログラミング言語の設計に大きな貢献をしている[Simon Peyton Jones](http://en.wikipedia.org/wiki/Simon_Peyton_Jones)の記事(com/en-us/um/people/simonpj/papers/stm) –

1

最初の懸念事項として、それぞれのインスタンスにメンバーミューテックスを設定して、それぞれに個別のクリティカルセクションを提供する必要があります。

第2の実装では、ほとんどのpthread実装でmutexにfutex実装を使用していることが確信しています。これは、競合がなくてもかなり高速で、競合が発生した場合にのみOSの介入を必要とすることを意味します。

+0

フューテックスはLinuxに特化しています –

+0

コアのアイデアは同じでなければなりません。まともなOSであれば、オーバーヘッドの少ない同期メカニズムのためのシステムコールを提供する必要があります。また、同期の抽象化(mutexなど)を提供するライブラリであれば、それを適切に使用する必要があります。私は私の個人的な経験に話していただけだった。 –

0

ロックやクリティカルセクションを使用したくない場合、最も簡単な解決策は、オブジェクト自体に状態を保持することではありません。あなたは、次のようなあなたのクラスを変更する場合は、スレッドセーフになります。

// Class has no state, only operations on data. So it 
// is thread-safe by nature. 
class MyCls 
{ 
    int foo(int x = 0) 
    { 
     return ++x; 
    } 
}; 

// Usage 
MyCls obj; 
int x = obj.foo(); // x = 1 
x = obj.foo(x); // x = 2 
+0

これは、特定のケースでトリックを行うかもしれないので、私はそれをdownvoteしませんでしたが、私は主に私たちのオブジェクトがデータをカプセル化したいと思っています。 – riviera

0

あなたが本当に唯一そのメンバー(または類似した単純な算術)をインクリメントする必要がある場合は、あなただけのアトミック操作を必要としています。

  • 現代のほとんどのCPUがネイティブの指示で をサポートしています。
  • 他のコンパイラについてはわかりませんが ですが、gccファミリのコンパイラは を内蔵しています。

残念ながら、これらのインターフェイスは標準化されていないようですが、近い将来C標準(C1x)がそれらを持つことになります。