このウェブサイトは初めてですので、受け入れられた方法で投稿していない場合はお知らせください。
私は頻繁に以下のサンプルの線に沿って何かをコーディングしました(明確にするためにDisposeのようなものは省略されています)。私の質問は、示されているように揮発性物質が必要ですか?または、Thread.Startを読んだように、ManualResetEvent.Setには暗黙のメモリバリアがありますか?または、明示的なMemoryBarrier呼び出しは、揮発性物質よりも優れていますか?それとも完全に間違っていますか?また、私が見た限りでは、一部の操作での「潜在記憶バリアの動作」が文書化されていないという事実は非常に苛立たしいものですが、これらの操作のリストはどこかにありますか?
ありがとう、トム
:
class OneUseBackgroundOp
{
// background args
private string _x;
private object _y;
private long _z;
// background results
private volatile DateTime _a
private volatile double _b;
private volatile object _c;
// thread control
private Thread _task;
private ManualResetEvent _completedSignal;
private volatile bool _completed;
public bool DoSomething(string x, object y, long z, int initialWaitMs)
{
bool doneWithinWait;
_x = x;
_y = y;
_z = z;
_completedSignal = new ManualResetEvent(false);
_task = new Thread(new ThreadStart(Task));
_task.IsBackground = true;
_task.Start()
doneWithinWait = _completedSignal.WaitOne(initialWaitMs);
return doneWithinWait;
}
public bool Completed
{
get
{
return _completed;
}
}
/* public getters for the result fields go here, with an exception
thrown if _completed is not true; */
private void Task()
{
// args x, y, and z are written once, before the Thread.Start
// implicit memory barrier so they may be accessed freely.
// possibly long-running work goes here
// with the work completed, assign the result fields _a, _b, _c here
_completed = true;
_completedSignal.Set();
}
}