Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++11 memory model and accessing different members of the same struct in different threads

Tags:

Assume you've got the following definitions:

struct X
{
  char a, b;
};

X x;

And now assume you have two threads, one of which reads and writes x.a but never accesses x.b while the other one reads and writes x.b but never accesses x.a. Neither thread uses any locks or other synchronization primitives. Is this guaranteed to work in C++11? Or does it count as accessing the same object, and therefore need a lock?

like image 951
celtschk Avatar asked Aug 18 '13 20:08

celtschk


People also ask

Can multiple threads read the same memory?

Not only are different cores allowed to read from the same block of memory, they're allowed to write at the same time too.

What is memory model in C ++ 11?

C++11 Memory Model. A memory model, a.k.a memory consistency model, is a specification of the allowed behavior of multithreaded programs executing with shared memory [1].


1 Answers

It's safe. Quoting C++11:

[intro.memory]p3:

A memory location is either an object of scalar type or a maximal sequence of adjacent bit-fields all having non-zero width. [ Note: Various features of the language, such as references and virtual functions, might involve additional memory locations that are not accessible to programs but are managed by the implementation. —end note ] Two threads of execution (1.10) can update and access separate memory locations without interfering with each other.

[intro.memory]p5:

[ Example: A structure declared as

struct {
  char a;
  int b:5,
  c:11,
  :0,
  d:8;
  struct {int ee:8;} e;
}

contains four separate memory locations: The field a and bit-fields d and e.ee are each separate memory locations, and can be modified concurrently without interfering with each other. The bit-fields b and c together constitute the fourth memory location. The bit-fields b and c cannot be concurrently modified, but b and a, for example, can be. —end example ]

These together mean that the members a and b of X are separate memory locations, and can thus be accessed concurrently.

like image 137
Angew is no longer proud of SO Avatar answered Oct 29 '22 14:10

Angew is no longer proud of SO