Are C++ Reads and Writes of an int Atomic?

2019-01-03 02:28发布

I have two threads, one updating an int and one reading it. This is a statistic value where the order of the reads and writes is irrelevant.

My question is, do I need to synchronize access to this multi-byte value anyway? Or, put another way, can part of the write be complete and get interrupted, and then the read happen.

For example, think of a value = 0x0000FFFF that gets incremented value of 0x00010000.

Is there a time where the value looks like 0x0001FFFF that I should be worried about? Certainly the larger the type, the more possible something like this to happen.

I've always synchronized these types of accesses, but was curious what the community thinks.

15条回答
甜甜的少女心
2楼-- · 2019-01-03 03:02

Boy, what a question. The answer to which is:

Yes, no, hmmm, well, it depends

It all comes down to the architecture of the system. On an IA32 a correctly aligned address will be an atomic operation. Unaligned writes might be atomic, it depends on the caching system in use. If the memory lies within a single L1 cache line then it is atomic, otherwise it's not. The width of the bus between the CPU and RAM can affect the atomic nature: a correctly aligned 16bit write on an 8086 was atomic whereas the same write on an 8088 wasn't because the 8088 only had an 8 bit bus whereas the 8086 had a 16 bit bus.

Also, if you're using C/C++ don't forget to mark the shared value as volatile, otherwise the optimiser will think the variable is never updated in one of your threads.

查看更多
Evening l夕情丶
3楼-- · 2019-01-03 03:05

I agree with many and especially Jason. On windows, one would likely use InterlockedAdd and its friends.

查看更多
相关推荐>>
4楼-- · 2019-01-03 03:07

On Windows, Interlocked***Exchange***Add is guaranteed to be atomic.

查看更多
登录 后发表回答