Почему MSDN выбирает от Поточной обработки Учебного катастрофического отказа?

Установка строки является атомарной операцией, т.е. Вы или получите новую строку или старую строку, Вы никогда не будете получать мусора.

, Если Вы делаете некоторую работу, например,

obj.SampleProperty = "Dear " + firstName + " " + lastName;

тогда строковая конкатенация, все происходит перед вызовом для установки поэтому sampleField всегда или будет новой строкой или старым.

, Если однако Ваш строковый код конкатенации сам справочный, например,

obj.SampleProperty += obj.SampleProperty + "a";

и еще где на другом потоке Вы имеете

obj.SampleProperty = "Initial String Value";

Тогда, Вам нужна блокировка.

Полагают, что Вы работаете с интервалом, Если Вы присваиваете интервалу, и любое значение, которое Вы получаете от интервала, допустимо, тогда Вы не должны блокировать его.

Однако, если интервал проводит подсчет количества виджетов, обработанных двумя или больше потоками для количества, чтобы быть точным, необходимо заблокировать интервал. Это - та же ситуация для строк.

у меня есть чувство, что я не объяснил это очень хорошо, надеялся, что это помогает.

Спасибо

BW

5
задан Gennady Vanin Геннадий Ванин 27 February 2013 в 01:55
поделиться

1 ответ

После ожидания мьютекса вы должны освободить его, используя

Mutex.ReleaseMutex()

перед завершением потоков.

исправлено t1start - t4start

public void t1Start()
{
    Console.WriteLine("t1Start started,  Mutex.WaitAll(Mutex[])");
    Mutex[] gMs = new Mutex[2];
    gMs[0] = gM1;  // Create and load an array of Mutex for WaitAll call 
    gMs[1] = gM2;
    Mutex.WaitAll(gMs);  // Waits until both gM1 and gM2 are released  
    Thread.Sleep(2000);
    Console.WriteLine("t1Start finished, Mutex.WaitAll(Mutex[]) satisfied");
    Event1.Set();      // AutoResetEvent.Set() flagging method is done
    gM1.ReleaseMutex();
    gM2.ReleaseMutex();
}
public void t2Start()
{
    Console.WriteLine("t2Start started,  gM1.WaitOne( )");
    gM1.WaitOne();    // Waits until Mutex gM1 is released ---errors is here---    
    Console.WriteLine("t2Start finished, gM1.WaitOne( ) satisfied");

    gM1.ReleaseMutex();
    Event2.Set();     // AutoResetEvent.Set() flagging method is done

}
public void t3Start()
{
    Console.WriteLine("t3Start started,  Mutex.WaitAny(Mutex[])");
    Mutex[] gMs = new Mutex[2];
    gMs[0] = gM1;  // Create and load an array of Mutex for WaitAny call  
    gMs[1] = gM2;

    int result = Mutex.WaitAny(gMs);  // Waits until either Mutex is released  
    gMs[result].ReleaseMutex();
    Console.WriteLine("t3Start finished, Mutex.WaitAny(Mutex[])"); Event3.Set();       // AutoResetEvent.Set() flagging method is done
}
public void t4Start()
{
    Console.WriteLine("t4Start started,  gM2.WaitOne( )");
    gM2.WaitOne();   // Waits until Mutex gM2 is released   
    Console.WriteLine("t4Start finished, gM2.WaitOne( )");
    Event4.Set();    // AutoResetEvent.Set() flagging method is done
    gM2.ReleaseMutex();
}
6
ответ дан 14 December 2019 в 13:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: