Подтвердить что ты не робот

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

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

struct X
{
  char a, b;
};

X x;

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

4b9b3361

Ответ 1

Это безопасно. Цитирование С++ 11:

[intro.memory] р3:

Место памяти - это либо объект скалярного типа, либо максимальная последовательность смежных битовых полей, имеющих ненулевую ширину. [Примечание. Различные функции языка, такие как ссылки и виртуальные функции, могут включать дополнительные ячейки памяти, которые недоступны для программ, но управляются реализацией. -end note] Два потока выполнения (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. -end пример]

Они означают, что члены a и b of X являются отдельными ячейками памяти и могут быть доступны одновременно.