Может ли кто-нибудь привести пример того, как зависание потоков может быть вызвано на языке С#?
Пример тупика резьбы в С#
Ответ 1
static object object1 = new object();
static object object2 = new object();
public static void ObliviousFunction()
{
lock (object1)
{
Thread.Sleep(1000); // Wait for the blind to lead
lock (object2)
{
}
}
}
public static void BlindFunction()
{
lock (object2)
{
Thread.Sleep(1000); // Wait for oblivion
lock (object1)
{
}
}
}
static void Main()
{
Thread thread1 = new Thread((ThreadStart)ObliviousFunction);
Thread therad2 = new Thread((ThreadStart)BlindFunction);
thread1.Start();
thread2.Start();
while (true)
{
// Stare at the two threads in deadlock.
}
}
Ответ 2
На другом конце шкалы, отдельные контексты синхронизации приглашать тупики. Вот пример:
[Synchronization]
public class Deadlock : ContextBoundObject {
public DeadLock Other;
public void Demo() { Thread.Sleep (1000); Other.Hello(); }
void Hello() { Console.WriteLine ("hello"); }
}
public class Test {
static void Main() {
Deadlock dead1 = new Deadlock();
Deadlock dead2 = new Deadlock();
dead1.Other = dead2;
dead2.Other = dead1;
new Thread (dead1.Demo).Start();
dead2.Demo();
}
Поскольку каждый экземпляр Deadlock созданный в рамках теста - несинхронизированный класс - каждый экземпляр получит собственную синхронизацию контекст и, следовательно, собственный замок. когда два объекта обращаются друг к другу, это не займет много времени для тупика (одна секунда, если быть точным!) Проблема была бы особенно коварный, если Тупик и Тест классы были написаны разными команд программирования. Это может быть необоснованно ожидать таких ответственный за класс тестирования даже осознавая свою беззаконие, пусть самостоятельно знают, как решить проблему Это. Это контрастирует с явным замки, где обычно действуют тупики более очевидным.