Я работаю над классом, который создает и управляет несколькими соединениями сокета и который будет пересылать информацию, полученную от сокетов, к основному потоку и наоборот. Многопоточность, в которой я передаю так много информации, но и для меня (как и большинство вещей на C#), но мне нужно уточнить, что именно делают «блокировки».Что именно блокирует замок?
Когда я блокирую часть метода, это гарантирует, что ни один другой поток не сможет войти в этот раздел кода или он фактически предотвратит изменение всех переменных в этом разделе кода другими потоками независимо от того, где они происходят ?
Например:
public class TestLock
{
public volatile int a = 0;
public volatile int b = 2;
private object ALock = new Object();
public TestLock() { }
public void UnlockEdit(int atemp, int btemp)
{
a = atemp;
b = btemp;
}
public void LockedEdit(int atemp, int btemp)
{
lock(ALock)
{
a = atemp;
b = btemp;
}
}
public int[] ReturnValues()
{
int[] ret = new int[2];
lock (ALock)
{
ret[0] = a;
ret[1] = b;
}
return ret;
}
}
Если поток А вызывает метод «LockedEdit» и чуть-чуть достигает замка, прежде чем нить B входит в UnlockEdit. Что происходит? Будет ли блокировка предотвращать изменение резьбы B от a и b? И он будет блокироваться? Или блокировка применяется только к одной конкретной ветви кода? Или я должен применить один и тот же объект «блокировки» (ALock) к каждому методу чтения и записи для объектов, которые я хочу изменить и прочитать из нескольких потоков?
Этот вопрос также может помочь вам: http://stackoverflow.com/questions/9621438/confusion-about-the-lock-statement-in-c-sharp/9621805#9621805 –