シナリオは次のとおりです。
public class MainClass
{
private static Object common_object;
protected int Method_A()
{
...
lock (common_object)
{
// Works with common_object;
...
}
...
// Invokes another's thread Method_B
}
protected int Method_B()
{
...
}
}
クラス「メインクラス」と、そのインスタンスが 2 つ (またはそれ以上) あります。
クラスには、すべてのインスタンスによって共有され、必要に応じて "lock(){...}" を使用して保護されるオブジェクト (プライベート、静的) があります。問題ありません。
クラスには2つのメソッドもあり、それらはすべてを機能させようとして私を夢中にさせています。
外部から呼び出される「メインメソッド/関数」A があるとしましょう (私はこの呼び出しを制御することも、いつ発生するかについての知識もありませんが、ほとんどの場合、呼び出しの間には非常に短いスペースがあります)。呼び出しと次の呼び出し) 両方のスレッドで。
2 番目のメソッド B もあり、これは (実行時間とコードの両方で) はるかに短いものです。
問題は次のとおりです。
t2 がメソッド A を呼び出す
t1 がメソッド A を呼び出す
t2 (メソッド A から) が t1 のメソッド B を呼び出す
t1 と t2 はブロックされます。
1 つのスレッド (t2) のメソッド B が別のスレッド (t1) のメソッド A から呼び出され、t2 がメソッド A を実行しているときにそれが行われると、何らかの形ですべてがクラッシュします。通常、両方のスレッドがブロックされます。
私はフラグ変数を使用しているので、t2 がメソッド A の実行を開始すると、t1 はこのフラグを使用して、t2 がメソッド A の実行を終了するまで t2 のメソッド B を呼び出すことができないことを認識しますが、何か不足しているようです。うまくいかないからです。
私は Java での作業に慣れていますが、C# コードの背後にはまったく同じロジックがあると思いますが、c# にはいくつかの関数または「トリック」が欠けているに違いないと思います。
これは市長の問題ではないので、この問題を解決する簡単な方法があるに違いないと思います (そして願っています)。そして、3 日経っても自分自身で大きな進歩が見られないまま、ようやくここに来て助けを求めました。
前もって感謝します。