0

私はC#の初心者です。マルチスレッドのサンプルを見ています。

メソッド へのマルチスレッド呼び出しを設定しましたDoTransactions()。これにより、 として乱数が生成されamount、 メソッドを呼び出して によってWithdraw()差し引かsalaryamountます。

1) 私が理解できないのは、ライターがthisLock給与をロックする代わりにオブジェクトをロックすることを選択した理由です。オブジェクトを宣言してロックすることにより、この方法でスレッドをロックする他の人も見ました。

2) 他のスレッドが実行されているときに呼び出されたメソッドをデバッグできないことがあります。(F10/F11 を押す)。(例: メソッドWithdraw())。これには何か理由がありますか?

Department dep = new Department(1000); 
Thread t = new Thread(new ThreadStart(dep.DoTransactions));   //set up 1000 threads.

class Department
    {
        private Object thisLock = new Object();
        int salary = 10000;

        int Withdraw(int amount)
        {
            lock (thisLock)
            {
                if (salary >= amount)
                {
                    salary = salary - amount;
                    return amount;
                }
            }
        }
4

5 に答える 5

2
  1. Salary は値型である int ですが、クラス (参照型) でのみロックできます。

MSDN :

lock ステートメントの式は、参照型の値を示さなければなりません。lock ステートメントの式に対して暗黙的なボックス化変換 (セクション 6.1.5) が実行されることはありません。したがって、式が値型の値を示すことはコンパイル時エラーです。

http://msdn.microsoft.com/en-us/library/aa664735(v=vs.71).aspx

  1. デバッグできないとはどういう意味ですか? おそらく、デバッガーはスレッド間をジャンプします。
于 2013-01-25T16:23:58.650 に答える
0

マルチスレッドアプリケーションをデバッグするときは、ブレークポイントを使用して特定のコード行を強制的に調べます。順番に作業するために、ステップインおよびステップオーバーに依存することはできません。

于 2013-01-25T16:31:09.687 に答える
0

2番目の質問への回答:

最初に「すべてブレーク」を選択して(「すべてブレーク」ボタンをクリック)、すべてのスレッドの実行を停止してから、「デバッグ| Windows |スレッド」に移動して、デバッグできるすべてのスレッドのリストを表示する必要がある場合があります。(もちろん、それぞれに個別のスタックフレームがあります。)

そこからスレッドをダブルクリックして、そのソースコードがあるかどうかを確認できます。(いくつかはあなたが始めなかった「内部」スレッドであり、これらはあなたが見ることができるソースコードを持っていません。面白いものが見つかるまでスレッドをクリックし続けてください。;)

それ以外に、関心のあるスレッドが実行するコードにブレークポイントを設定します。

于 2013-01-25T16:32:04.630 に答える
0

ロックは、常に 1 つのスレッドのみがそのビットのコードにアクセスできるようにするために使用されます。また、スレッド間の同期を有​​効にするには、すべてのスレッドで共通に使用できるオブジェクトを順番にロックする必要があります。

于 2013-01-25T16:21:56.070 に答える
0

lockステートメントに入れるもの( などlock (thisLock)) は、ロックされているデータではありません。考えてみれば、それは当てはまりません: 2 つの変数を変更したい場合、どちらを ? に入れlockますか? (答え: 答えはありません。不可能です。)

代わりに、ロックによって論理的に保護されているデータにアクセスするときに、規則によって常にロックされるオブジェクトへの参照を入れます。

于 2013-01-25T16:24:41.290 に答える