0

デッドロックの問題が発生したと思います...私のプログラムは正常に動作していますが、時々応答しなくなります...???. ソース コード (C#) では、ロック (オブジェクト) または ReaderWriterLockSlim がありません... 同じオブジェクト (リスト) を使用して 2 つのスレッドでデッドロックを再現しようとしましたが、成功しませんでした..

int n = 0;                      
  List<int> temp = new List<int>();
  var up = new Thread(() =>{
     for (int i = 0; i < 100000; i++){
     n++;
     temp.Add(i);                   
}
});

var down = new Thread(() => {
    for (int i = 0; i < 100000; i++){
        n--;
         try{
           temp.Remove(i);
         }catch {
           Console.WriteLine("No item {0} to remove", i);
         }
        }
});

up.Start();
down.Start();
down.Join();
up.Join();
Console.WriteLine(String.Join(",",temp));

上記の狙撃コードは、デッドロックなしで動作します..??? 誰かがロック(オブジェクト)またはシステムロックなしで同じ変数を使用して2つのスレッドでデッドロックを再現するのを手伝ってくれませんか...

少し早いですがお礼を

4

2 に答える 2

3

Listスレッドセーフではないため、これが問題の原因になります。スレッド セーフなソリューションを作成し (スレッド セーフなコレクションを使用するlockか、スレッド セーフなコレクションを使用して)、デッドロックの再現に集中する必要はありません。それはあなたに何を伝えますか?

于 2013-09-27T17:44:34.307 に答える
1

通常、ロックまたは同期を使用するとデッドロックが発生します。

最も一般的なデッドロックは、スレッドからの Gui の更新です。お気に入り:

Thread thread = new Thread( () => 
{ 
    Invoke(new Action(() => 
    {
        Label1.Text = "something";
    }));
});

thread.Start();

// this join will prevent the messageloop from running, but the invoke waits on the messageloop to execute it's action.
thread.Join();

しかし、それはあなたの場合とは異なります。

n異なるスレッドで が増減する (リストを変更するのと同じ)ことを意味していると思います。これはデッドロックではなく、スレッドセーフの問題です。

そこにロックを入れてもデッドロックにはなりません。

object lockObj = new object();

 var up = new Thread(() =>
 {
     for (int i = 0; i < 100000; i++)
     {
         lock(lockObj)
         {
             n++;
             temp.Add(i);                   
         }
     }
 });

 var down = new Thread(() => 
 {
     for (int i = 0; i < 100000; i++)
     {
         lock(lockObj)
         {
             n--;
             try
             {
                 temp.Remove(0);
             }
             catch 
             {
                 Console.WriteLine("No item {0} to remove", i);
             }
         }
     }
});

しかし、これはプロセスを非常に遅くします。

于 2013-09-27T17:44:41.870 に答える