Установка строки является атомарной операцией, т.е. Вы или получите новую строку или старую строку, Вы никогда не будете получать мусора.
, Если Вы делаете некоторую работу, например,
obj.SampleProperty = "Dear " + firstName + " " + lastName;
тогда строковая конкатенация, все происходит перед вызовом для установки поэтому sampleField всегда или будет новой строкой или старым.
, Если однако Ваш строковый код конкатенации сам справочный, например,
obj.SampleProperty += obj.SampleProperty + "a";
и еще где на другом потоке Вы имеете
obj.SampleProperty = "Initial String Value";
Тогда, Вам нужна блокировка.
Полагают, что Вы работаете с интервалом, Если Вы присваиваете интервалу, и любое значение, которое Вы получаете от интервала, допустимо, тогда Вы не должны блокировать его.
Однако, если интервал проводит подсчет количества виджетов, обработанных двумя или больше потоками для количества, чтобы быть точным, необходимо заблокировать интервал. Это - та же ситуация для строк.
у меня есть чувство, что я не объяснил это очень хорошо, надеялся, что это помогает.
Спасибо
BW
После ожидания мьютекса вы должны освободить его, используя
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();
}