2013-09-27 5 views
0

Я думаю, у меня проблемы с тупиком ... Моя программа работает хорошо, но какое-то время она не реагирует ... ???. В исходном коде (C#) .. нет блокировки (Objet) или ReaderWriterLockSlim ... Я попытался воспроизвести затор с 2 нитями, используя тот же объект (List), но не успех ..Воспроизведение резьбового тупика с простым C#

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 нитями, используя ту же переменную без блокировки (объекта) или блокировки системы ...

заранее благодарим

+3

В каком коде есть _does_ есть проблема? Вы уверены, что это тупик, а не что-то другое, вызывающее невосприимчивость? –

+2

Можете ли вы воспроизвести проблему с вашим производственным кодом? –

+2

Поскольку у вас нет блокировки в этом коде, поэтому не может быть проблемы с блокировкой, но странное поведение. – VahiD

ответ

3

List не поточно-так что это будет причиной твоя проблема. Вы должны создать поточно-безопасное решение (используя lock или с потокобезопасными коллекциями), а не сосредоточиться на воссоздании тупика. Что это вам скажет?

+0

Спасибо @ meilke..Я думаю, проблема возникает из не-потокобезопасного режима. Но мне нужно воспроизвести системную зависание, прежде чем применять какое-либо решение. И я теперь нуждаюсь в поиске кода бекаса, который позволяет системе повесить трубку. (без объекта блокировки или системного замка). – hoanganh17b

+0

@ hoanganh17b, я согласен, важно воспроизвести проблемы, чтобы, когда мы исправляем проблемы, мы уверены, что решаем актуальную проблему. Я нашел это сообщение в блоге интересным: http://blogs.msdn.com/b/tess/archive/2009/12/21/high-cpu-in-net-app-using-a-static-generic-dictionary.aspx – Pooven

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 увеличивается и уменьшается (то же, что и мутирующий список) на разные темы. Это не тупик, но threadsafety проблема.

Даже если вы вложили в него замок, вы не получите тупик.

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); 
      } 
     } 
    } 
}); 

Но это очень замедлит процесс.

+0

... большое спасибо за ваш комментарий. Но без блокировки (lockObj) .. код все еще работает хорошо, и я хочу понять, почему .. И как воспроизвести систему, зависающую с потоком без блокировки .. – hoanganh17b

Смежные вопросы