我有两个线程,一个更新一个int,另一个读取它.这是一个统计值,其中读取和写入的顺序无关紧要.
我的问题是,我是否需要同步访问这个多字节值?或者,换句话说,写入的一部分可以完成并被中断,然后读取就会发生.
例如,假设值= 0x0000FFFF,其值递增为0x00010000.
是否有时间值看起来像0x0001FFFF,我应该担心?当然,类型越大,发生这种情况的可能性就越大.
我总是同步这些类型的访问,但很好奇社区的想法.
解决方法:
起初人们可能认为本机大小的读取和写入是原子的,但是有许多问题要处理,包括处理器/核心之间的高速缓存一致性.在Windows上使用Interlocked *等原子操作,在Linux上使用等效操作. C 0x将有一个“原子”模板将它们包装在一个漂亮的跨平台接口中.目前,如果您使用的是平台抽象层,它可能会提供这些功能. ACE确实如此,请参阅类模板ACE_Atomic_Op.