2016-02-22 3 views
1

В C++, скажем, у меня есть переменная basic тип данных, например int counter, который используется многими потоками. Чтобы изменить counter, нить должна сначала получить простой замок. Но я хочу, чтобы значение было доступно для чтения в любое время, независимо от того, заблокировано оно или нет.Одновременная запись базовых данных данных

Когда поток читает counter, а какой-то другой поток его модифицирует, есть ли у меня какая-либо гарантия, по крайней мере, получить либо значение предварительной записи, либо пост-запись, а не какое-то поврежденное значение?

Например:

//counter == 10 
counter += 5; 
//counter == 15 

Будут все темы чтения counter вокруг этого времени быть гарантировано по крайней мере читать 10 или 15? Вместо какого-то странного значения, такого как -834289.

Если ответ от конкретной реализации, я использую Visual Studio 2015.

+1

Только намек на терминологию - то, что вы просите о обычно называется «рваные чтения». Вы можете использовать эту информацию для получения дополнительной информации. – SergeyA

+2

Есть ли веская причина не использовать 'std :: atomic'? В конце концов, он обеспечивает гарантии о том, что чтение и запись реализованы надлежащим образом для конкретного оборудования, которое вы компилируете. Умышленно писать код, который требует, чтобы вы спросили, будет ли он работать прямо на вашем оборудовании, является преждевременной (и, вероятно, неуместной) оптимизацией. –

ответ

2

В Intel architectures назначение значений размера слова обычно является атомарным, поэтому вы не будете считывать поврежденное значение.

+0

Я еще не видел архитектуру, где возможны разрывы на правильном выравнивании и размерах. – SergeyA

+0

Да, ОП. Что вы подразумеваете? – SergeyA

+0

@SergeyA, я не уверен, что понимаю, к чему идет ваш оригинальный комментарий. Не могли бы вы прояснить? Вы подразумеваете, что разблокированное чтение выводит коррумпированное значение? – merlin2011

3

Нет, это не так. Используйте std::atomic_int

+0

Вам будет сложно найти современную проблему, когда это действительно будет проблемой. – SergeyA

+0

@Sergey так же, как любой современный ISA использовать 2s дополнение вы можете безвредно предположить, что, а? Написание кода с неопределенным поведением - плохая идея, если исправление тривиально. Используйте расслабленную семантику и не будет никакой разницы в производительности. – Voo

+0

@Voo, можете ли вы ссылаться на документацию, предлагающую неопределенное поведение для разблокированных чтений? – merlin2011

Смежные вопросы