不可解に停止しているプロセスをトラブルシューティングしようとしています。また、変数がキャッシュされて二度と読み取れないという問題が発生する可能性があるかどうかを判断しようとしています。
私のシナリオでは、タイマーで発生する操作 (これを と呼びますPoll
) と、外部操作の開始と停止を通知するために呼び出される外部関数のペアがあります。実際には詳細に入る価値がないため、この架空のクラスでは、外部操作が行われている場合に Poll 操作を実行したくありません。さらに、外部操作は同時に複数回発生する可能性があるため、進行中の操作の数を示すためにカウンターを使用しています。
現在のロジックは、次の単純化された例のように見えます。
class MyClass
{
private int operationsInProgress;
private void Poll() // Pretend we have a timer in place that's calling this periodically
{
var inProgress = operationsInProgress;
if (inProgress > 0) return;
DoSomething();
}
public void StartExternalOperation()
{
Interlocked.Increment(ref operationsInProgress);
}
public void EndExternalOperation()
{
Interlocked.Decrement(ref operationsInProgress);
}
}
仮定:
StartExternalOperation
との両方EndExternalOperation
が同じ回数だけ呼び出されていtry...finally
ます。Start
- 不確定な回数の実行後のある時点で、
DoSomething()
再び呼び出されることはありません。私の実際のシナリオでは、正確な理由はわかりませんが、これ以外に見つけられるすべての原因を排除しました。
値がキャッシュされ、実際の変数が再度読み取られないという読み取り操作で、何らかの種類のフェンス (スルーInterlocked
または変数)を使用していない可能性はありますか?volatile
これは確実に再現できない問題であるため、私が疑っているものが合理的に原因であるかどうかを知る必要があります. ReaderWriterLock
(または)のようなより正式なものを使用するようにコードを変更することができ、Slim
適切なロジックがあることはわかっています。説明したことが正当に原因であるかどうかを知る必要があります。