0

シナリオは次のとおりです。

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 日経っても自分自身で大きな進歩が見られないまま、ようやくここに来て助けを求めました。

前もって感謝します。

4

2 に答える 2

0

ここで混乱していると思います。1 つのクラスと 1 つのオブジェクトしかありません。スレッドには独自のメソッドのコピーがありません。Method_A が Method_B を呼び出すと、すべてが 1 つのスレッド上にあります。また、フラグは非常に使いにくいです。あなたはあなたの例にそれを入れていないので、あなたが間違っていることを具体的に言うことはできませんが、最初の試みでそれらを正しくしたことはありません. (または 2 番目。) 可能であれば、それらを避けるのが最善です。

この場合、必要なことは Method_B への呼び出しを common_object ロック ブロック内に配置することだけだと思います。

私が見る限り、あなたがやっていることはすべてC# でも Java と同じように機能します。

于 2013-07-18T16:23:34.840 に答える