Это перефразирование вопроса, который у меня был раньше.Это простой вопрос, но я не могу его понять.
Если у меня есть общий код:
private static object objSync = new object();
private int a = 0;
public void function()
{
lock(objSync)
a += 2;
lock(objSync)
a += 3;
Console.WriteLine(a.ToString());
a=0;
}
Я не могу ожидать, что 'a' будет равно 5 в концепотому что первый поток получает блокировку, устанавливает 'a' в 2, а затем следующий поток может получить блокировку, установив ее в '4', прежде чем первый поток сможет добавить 3, и в итоге вы получите 7 в конце.
Как я понимаю, решение состоит в том, чтобы установить блокировку вокруг всего, и тогда вы всегда можете ожидать 5. Теперь мой вопрос заключается в том, что, если между двумя блокировками будет миллион строк кода.Я не могу себе представить, чтобы поставить блокировку вокруг миллиона строк кода.Как бы вы обеспечивали безопасность потоков, но не отказывались от производительности, блокируя миллион и две строки кода?
РЕДАКТИРОВАТЬ:
Это бессмысленный код, который я написал для вопроса.Фактическое применение - система контроля линии.Есть два экрана, которые показывают текущую строку, один для клерков и один для публики.Экран для клерка принимает «щелчки» через последовательный порт, который последовательно продвигается по линии, а затем обновляет общедоступный экран с помощью события уведомления (см. Шаблон проектирования наблюдателя).Проблема в том, что они не синхронизируются, если вы спамите кликер.Я представляю, что происходит, когда первый экран добавляет номер строки, отображает его, а затем обновляет открытый экран, но перед тем, как на открытом экране появится возможность показать номер строки из базы данных, клерк снова щелкает, и номер выходитсинхронизация.«A» выше представляет значение, которое я извлекаю из базы данных, а не просто int.Есть несколько мест, где я могу изменить значение, и мне нужно, чтобы все это происходило атомарно.