C++ 为1个字的共享内存使用互斥
我有一个应用程序,其中多个线程访问和写入一个1字(16位)的共享内存 我能期望处理器在原子操作中从内存读写一个字吗?所以我不需要共享内存/变量的互斥保护 目标是运行VxWorks的嵌入式设备C++ 为1个字的共享内存使用互斥,c++,c,concurrency,mutex,vxworks,C++,C,Concurrency,Mutex,Vxworks,我有一个应用程序,其中多个线程访问和写入一个1字(16位)的共享内存 我能期望处理器在原子操作中从内存读写一个字吗?所以我不需要共享内存/变量的互斥保护 目标是运行VxWorks的嵌入式设备 编辑:只有一个CPU,这是一个旧的(>7年)-我不完全确定架构和模型,但我对“大多数”CPU的工作方式更感兴趣。如果它是一个16位的CPU,那么在大多数情况下,它会在一次操作中读取/写入16位变量吗?或者在任何情况下我都应该使用互斥保护吗?假设我不关心可移植性,我们讨论的是C++98。问题不在于访问的原子性
编辑:只有一个CPU,这是一个旧的(>7年)-我不完全确定架构和模型,但我对“大多数”CPU的工作方式更感兴趣。如果它是一个16位的CPU,那么在大多数情况下,它会在一次操作中读取/写入16位变量吗?或者在任何情况下我都应该使用互斥保护吗?假设我不关心可移植性,我们讨论的是C++98。问题不在于访问的原子性(除非您使用的是8位MC,否则您通常可以假设),而在于缺少同步,从而导致未定义的行为。
如果您想编写可移植代码,请使用原子。如果您想为您的特定平台实现最大性能,请仔细阅读操作系统和编译器的文档,看看它们为多线程程序提供了哪些额外的机制或保证(但我真的怀疑您是否能找到比std::atomic更有效的机制或保证).问题不在于访问的原子性(除非您使用的是8位MC,否则您通常可以假设这一点),而在于缺少同步,从而导致未定义的行为。
如果您想编写可移植代码,请使用原子。如果您想为您的特定平台实现最大性能,请仔细阅读操作系统和编译器的文档,看看它们为多线程程序提供了哪些额外的机制或保证(但我真的怀疑您是否能找到比std::atomic更有效的机制或保证).所有处理器都将自动读写对齐的机器字,因为如果由另一个处理器读取,则不会得到旧值的一半位和新值的一半位 为了获得良好的速度,现代处理器不会将读-写操作同步到特定位置,除非您确实要求同步-因为几乎所有的读和写都到“非共享”位置 因此,如果该值是一个计数器,表示我们遇到特定条件的次数,或者其他“如果我们读/写一个旧值,它会出错”的情况,那么您需要确保两个处理器不会同时更新该值。这通常可以通过
原子
指令(或某种其他形式的原子
更新)来完成-这将确保在任何给定时间只有一个处理器接触该值,而且,当其他处理器刚刚进行更新时,所有其他处理器都不会保存他们认为准确且最新的值的副本。请参阅C++11函数集
请注意以原子方式读取或写入机器字的值与以原子方式执行整个更新之间的区别。所有处理器都将以原子方式读取和写入对齐的机器字,因为如果由另一个处理器读取,则不会获得旧值的一半位和新值的一半位 为了实现良好的速度,现代处理器不会将读modif写入操作同步到特定位置,除非您实际要求它——因为几乎所有读写都会转到“非共享”位置 因此,如果该值是一个计数器,表示我们遇到特定条件的次数,或者其他“如果我们读/写一个旧值,它会出错”的情况,那么您需要确保两个处理器不会同时更新该值。这通常可以通过
原子
指令(或某种其他形式的原子
更新)来完成-这将确保在任何给定时间只有一个处理器接触该值,而且,当其他处理器刚刚进行更新时,所有其他处理器都不会保存他们认为准确且最新的值的副本。请参阅C++11函数集
注意以原子方式读取或写入机器字的值与以原子方式执行整个更新之间的区别
我能期望处理器在原子操作中从内存读写一个字吗
对
所以我不需要共享内存/变量的互斥保护
不,请考虑:
++i;
即使读和写是原子的,两个同时执行此操作的线程也可以每次读取、每次增量,然后每次写入,从而在需要两个线程的地方只产生一个增量
我能期望处理器在原子操作中从内存读写一个字吗
对
所以我不需要共享内存/变量的互斥保护
不,请考虑:
++i;
即使读和写是原子的,两个同时执行此操作的线程也可以每次读取、每次增量,然后每次写入,从而在需要两个线程的地方只产生一个增量
我能期望处理器在原子操作中从内存读写一个字吗
是的,如果数据正确对齐且大小不超过一个机器字,那么大多数CPU指令将按照您所描述的方式在其上进行原子操作
所以我不需要共享内存/变量的互斥保护
您确实需要一些同步-无论是互斥还是使用原子操作
原因包括:
- 如果您的变量不是易失性的,编译器甚至可能不会在您可能期望的位置为名义上保存该变量的内存地址发出读写指令,而是重用在CPU寄存器中保存或在编译时已知的先前读取或设置的值