В C++, скажем, у меня есть переменная basic тип данных, например int counter
, который используется многими потоками. Чтобы изменить counter
, нить должна сначала получить простой замок. Но я хочу, чтобы значение было доступно для чтения в любое время, независимо от того, заблокировано оно или нет.Одновременная запись базовых данных данных
Когда поток читает counter
, а какой-то другой поток его модифицирует, есть ли у меня какая-либо гарантия, по крайней мере, получить либо значение предварительной записи, либо пост-запись, а не какое-то поврежденное значение?
Например:
//counter == 10
counter += 5;
//counter == 15
Будут все темы чтения counter
вокруг этого времени быть гарантировано по крайней мере читать 10
или 15
? Вместо какого-то странного значения, такого как -834289
.
Если ответ от конкретной реализации, я использую Visual Studio 2015.
Только намек на терминологию - то, что вы просите о обычно называется «рваные чтения». Вы можете использовать эту информацию для получения дополнительной информации. – SergeyA
Есть ли веская причина не использовать 'std :: atomic'? В конце концов, он обеспечивает гарантии о том, что чтение и запись реализованы надлежащим образом для конкретного оборудования, которое вы компилируете. Умышленно писать код, который требует, чтобы вы спросили, будет ли он работать прямо на вашем оборудовании, является преждевременной (и, вероятно, неуместной) оптимизацией. –