Модель памяти C ++ 11 и доступ к различным членам одной и той же структуры в разных потоках

Предположим, у вас есть следующие определения:

struct X
{
char a, b;
};

X x;

А теперь предположим, что у вас есть два потока, один из которых читает и пишет x.a но никогда не заходит x.b в то время как другой читает и пишет x.b но никогда не заходит x.a, Ни один из потоков не использует блокировки или другие примитивы синхронизации. Гарантируется ли это в C ++ 11? Или он считается доступом к одному и тому же объекту и, следовательно, нуждается в блокировке?

17

Решение

Это безопасно. Цитирую C ++ 11:

[Intro.memory] р3:

место в памяти является либо объектом скалярного типа, либо максимальной последовательностью смежных битовых полей, имеющих ненулевую ширину. [ Замечания: Различные функции языка, такие как ссылки и виртуальные функции, могут включать дополнительные области памяти, которые не доступны для программ, но управляются реализацией. —Конечная записка ] Два потока выполнения (1.10) могут обновлять и получать доступ к отдельным ячейкам памяти, не мешая друг другу.

[Intro.memory] П5:

[ Пример: Структура объявлена ​​как

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 являются отдельными ячейками памяти, и поэтому могут быть доступны одновременно.

26

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]