(注:私はすでにこの質問をしましたが、その答えはJava固有のものでしたので、C#と.NETフレームワークについて同じ質問をしています。このパターンはしばらくありましたが、私は最近、これを行うことがOKではないかもしれないと考えるようになりました。基本的に、私はこのパターンのいくつかのバリアントを使用します。C#/ .NETでは、unresettable "flags"はスレッドセーフですか?
public class SampleAsync
{
public SampleAsync() { }
private bool completed;
public void Start()
{
var worker = new BackgroundWorker();
worker.DoWork += (sender, e) => {
//... do something on a different thread
completed = true;
};
worker.RunWorkerAsync();
}
public void Update()
{
if (!completed) return;
//... do something else
}
}
*ユーザーはStart
は一度だけ呼び出されることを確認する責任があります。 Update
はいつでもどこでも呼び出されます。
私は常に、何も厳密には同期されていないにもかかわらず、completed
をtrueに設定しているため、C#/ .NETフレームワークでスレッドセーフであると仮定しています。 true
であることが確認されると、false
にリセットされません。これはコンストラクタでfalseに初期化されます。これは定義上スレッドセーフです(あなたが何か愚かなことをしない限り)。だから、このようにしてunresettableフラグを使うのはスレッドセーフですか? (もしそうなら、それも任意のパフォーマンス上の利点を提供していますか?)
おかげ
あなたは 'volatile'が必要です。 – SLaks
C#とJavaでは?そうでなければthreadsafeですか? – aboveyou00
「一度それが真実であることが確認されたら」は、「揮発性」を使用しないと起こり得ないビットです。 –