Предположим, у вас есть следующие определения:
struct X
{
char a, b;
};
X x;
А теперь предположим, что у вас есть два потока, один из которых читает и пишет x.a
но никогда не заходит x.b
в то время как другой читает и пишет x.b
но никогда не заходит x.a
, Ни один из потоков не использует блокировки или другие примитивы синхронизации. Гарантируется ли это в C ++ 11? Или он считается доступом к одному и тому же объекту и, следовательно, нуждается в блокировке?
Это безопасно. Цитирую C ++ 11:
[Intro.memory] р3:[Intro.memory] П5:место в памяти является либо объектом скалярного типа, либо максимальной последовательностью смежных битовых полей, имеющих ненулевую ширину. [ Замечания: Различные функции языка, такие как ссылки и виртуальные функции, могут включать дополнительные области памяти, которые не доступны для программ, но управляются реализацией. —Конечная записка ] Два потока выполнения (1.10) могут обновлять и получать доступ к отдельным ячейкам памяти, не мешая друг другу.
[ Пример: Структура объявлена как
struct {
char a;
int b:5,
c:11,
:0,
d:8;
struct {int ee:8;} e;
}
содержит четыре отдельных области памяти: поле
a
и битовые поляd
а такжеe.ee
каждая из них является отдельной ячейкой памяти и может быть изменена одновременно, не мешая друг другу. Битовые поляb
а такжеc
вместе составляют четвертую ячейку памяти. Битовые поляb
а такжеc
не может быть одновременно изменено, ноb
а такжеa
, например, может быть. — конец примера ]
Это вместе означает, что члены a
а также b
из X
являются отдельными ячейками памяти, и поэтому могут быть доступны одновременно.
Других решений пока нет …