2017-09-08 4 views
0

差分スレッドからブール値を安全に読み込み/更新できますか?私は操作原子ですか?差分スレッドからブール値を安全に読み込み/更新できますか?

私がしたいことは、ブール値varをフラグとして使用することです。これは、すべてのプラットフォーム(android、ios、macos、linux、windows)次のようなものがあります。

var isempty: boolean; 

::thread x 
if not isempty then begin .... isempty := true; end; 
... 

::thread y 
isempty := false: 
+1

あなたの提案したコードが何であるか、そしてあなたが「安全」であることを明確にする必要があります。この質問で使用されているあいまいな用語よりもはるかに複雑です。たとえば、 'b:= not b'はどのプラットフォームでもアトミックではありません。あなたは何をしているのですか?十分な詳細がないので、私は知らない。 –

+0

私はちょうど質問を編集しました:) –

+0

** ABAの問題**について – Vasek

答えて

4

このコードはどのプラットフォームでもアトミックではありません。

AtomicCmpExchangeのようなアトミックな組み込み関数、またはTInterlocked.CompareExchangeのいずれかを使用する必要があります。これらは32ビットまたは64ビットオペランドで動作するので、LongBoolに切り替える必要があるかもしれないことに注意してください。

つまり、アトミック操作は、問題の正しい解決策ではない可能性があります。おそらく、適切な解決策は、同期プリミティブを使用することです。私たちが質問をしたことを判断することは不可能に近いです。私が言おうとしていることは、私はちょうど「これは原子的です」という質問にちょうど答えたことです。私はあなたの問題に対する解決策がアトミック比較/交換機能であるとは絶対に言わない。

+0

いいえ、私は同期をしたくない、私はちょうど1つのスレッドがisemptyを設定しているか知りたい:= xxx正確なナノ秒また、isempty:= xxx?はい、整数について私はAtomicCmpExchangeの必要性を理解していますが、それはまた論理的に必要ですか? –

+2

申し訳ありませんが、私はそのコメントを感知できません。 –

+0

よろしくお願いします。デビッド、私は質問を更新しました...今はっきりしていますように。 –

関連する問題