2011-09-15 9 views
1

私はコード変数アクセス

int i; //gobal var 

Thread1: 
{ 
... 
    i=some value; 
} 

Thread2: 
{ 
    if (i==2) dosomething(); 
    else dosomethingelse(); 
    i = 4; 
} 

を以下している私は、同期オブジェクトを使用しなくてもとC++の標準的な方法で、スレッドセーフであることを書きたいと思います。

私の質問は、同期を使用して別のスレッドでアクセスを読み書きする変数を持つ方法です。私の要件はtrueまたはfalseを持つことができるブール変数を持っています。

volatile変数はアトミックです。

iはアトミック変数を持っていTBBのような任意のlibrairesを使用することになっておりませんのでご注意ください。私たちは、この変数が非常に頻繁ではない変更として、我々はスレッドで変数にアクセスするたびに取るとsemphoreリリースしたくない、この質問をするための

理由。

+3

Boost AtomicsおよびC++ 0xスレッド仕様を参照してください。 '同期オブジェクトを使用せずにスレッドセーフであることを書いておきたい、何か他のものはあなたのものです。:) - さまざまな定義を安全にすることができます。ファジーが十分で、コードが時折「ファントム」値を読み取ることができる場合は、単一のライターがいる限りロッキングする必要はありません。 (これは、リアルタイムの監視メカニズムに役立つかもしれません)。また、変数が頻繁に変更されない場合、それは条件変数の良い候補のようです。 – sehe

+0

上記のシナリオで条件変数を使用する簡単な例を示してください。私の理解は、前進するのではなく、条件変数のブロックですが、ループしたいです – venkysmarty

+1

変数を読み取っているスレッドの数はどれくらいあり、スレッドを変更する可能性がありますか? – NPE

答えて

0

あなたのコードは今のところ意味がありません。あなたが基本的に言っているといいます。

Thread2: 
{ 
    if (i==2) dosomething(); 
    //let's do something if i is 2 at the moment I am reading it. 
    else dosomethingelse(); 
    i = 4; 
}` 

大丈夫ですか?しかし、あなたがiで何かをしているなら、あなたは困っています。 そうでなければ、iがアトミックであるかどうかを尋ねる場合は、CPUアーキテクチャに依存します。例えば、x86とx64の場合、それはアトミックです。 thisを読んでください。

+0

を書いているが、実際に私は基本的に私が持っている、私のプロジェクトから作られただけの簡単なコードを与えた1を読んで、他方は – venkysmarty

+0

@venkysmartyを書いている二つのスレッド: 'dosomethingelse)を(どのようにdoSomethingの'について 'と'?彼らはグローバル変数 'i'を使用していますか? 'dosomething(){std :: cout << i <<" \ n ";}'? –