2012-01-03 10 views
2

C++ 11の新しいスレッディングと少し混乱しています。私はmutexを使って2つのスレッドが同時に同じデータを操作するのを止めることができますが、そのデータに代入するのはどうですか?C++ 11スタック変数を使用したスレッドセーフ

例!

class Foo 
{ 
    std::string s; 

    // This would be called on a seperate thread 
    void Bar() { s = std::string("blah blah blah"); } 
}; 

、その場合、私はちょうど、だから私はSに何かを割り当てるてるので、私は何を求めていること、である、メンバ変数は、常に同じメモリ位置にとどまるsはない、との割り当ては、単に内部データを変更しますミューテックスが必要ですか?または、キャッシュされた値と状況で、まだ最新のデータを持っていることを確認するために、アトミック<>を使用する必要があることを意味しますか?それとも、intやstructsのような型の場合だけですか?

答えて

4

十分な保証があります。それを動作させるために必要な魔法は何でも、それに含まれています。 sの特定のインスタンスにアクセスまたは変更するすべてのスレッドが同じミューテックスの保護下にある限り、問題はありません。

アクセスと割り当ての唯一の違いは、これは、2つのスレッドが同じデータを同時に読み取るのを防ぐためにmutexを必要としないことです。ミューテックスは、あるスレッドが別のスレッドにアクセスしている間にオブジェクトが変更されている可能性がある場合にのみ必要です。並行読み取りが許可されます。

これは通常の規則であり、std::stringのような典型的なオブジェクトに適用されることに注意してください。 1つの目的であれば、並行読み取りであっても、同じタイプの別のオブジェクトが別のスレッドで読み取られているときに、1つのスレッドで1つのオブジェクトが読み取られた場合でも、破損するオブジェクトを作成できます。 (しかし、そのようなオブジェクトは有用ではなく、人々はそれらを作成するべきではありません)。

+0

* read *と呼ばれるメソッドで*書き込まれる*オブジェクトの読み込み時に壊れるオブジェクトはありませんか?別の可能性がある場合、私はそれを見てうれしいです。 –

+0

正確に。操作は論理的には読み取り操作ですが、物理的な書き込み操作を含みます。 (たとえば、GetValueOfParameter(std :: string paramName)のような操作を考えてください。パラメータがメモリにない場合は、SQLデータベースから読み込みます。あなたが求めた情報を見つけるために横断中に、見つかった「期限切れの」オブジェクトを削除します。 –

+2

'std :: map :: operator []'、呼び出し側が書き込み操作であることを忘れてしまうのは簡単です。私は、「彼らがそうであるように見えても、純粋な読み込みではないため、外部同期が必要な操作を文書化しなければならない」というように、「それらを作ってはいけない」とは言いません。 –

関連する問題