Architecture 是互斥';当应用程序oly写入而另一个读取时,需要s或信号量?

Architecture 是互斥';当应用程序oly写入而另一个读取时,需要s或信号量?,architecture,system,shared-memory,cpu-architecture,multicore,Architecture,System,Shared Memory,Cpu Architecture,Multicore,有两个应用程序运行在不同的内核上。一个应用程序写入4字节的共享内存位置,另一个核心上的另一个应用程序读取。这两个应用程序同时运行。这个模型适合我,不使用互斥或信号量。这有什么缺点吗?即使在这种情况下,是否需要互斥或信号量 这取决于平台。如果不了解平台,我们甚至无法想象它会如何失败。是否需要互斥或信号量取决于平台文档是否表示需要互斥或信号量。你无法通过实验来判断——穿过街道时不向两边看,也没有被车撞到,这并不表明它是安全的。下一个CPU、下一个编译器、下一个系统库甚至下一次系统升级都可能导致它失败

有两个应用程序运行在不同的内核上。一个应用程序写入4字节的共享内存位置,另一个核心上的另一个应用程序读取。这两个应用程序同时运行。这个模型适合我,不使用互斥或信号量。这有什么缺点吗?即使在这种情况下,是否需要互斥或信号量

这取决于平台。如果不了解平台,我们甚至无法想象它会如何失败。是否需要互斥或信号量取决于平台文档是否表示需要互斥或信号量。你无法通过实验来判断——穿过街道时不向两边看,也没有被车撞到,这并不表明它是安全的。下一个CPU、下一个编译器、下一个系统库甚至下一次系统升级都可能导致它失败,或者可能只是很少失败。

这取决于平台。如果不了解平台,我们甚至无法想象它会如何失败。是否需要互斥或信号量取决于平台文档是否表示需要互斥或信号量。你无法通过实验来判断——穿过街道时不向两边看,也没有被车撞到,这并不表明它是安全的。下一个CPU、下一个编译器、下一个系统库甚至下一次系统升级都可能导致它失败,或者它可能只是很少失败。

TL:DR:如果使用
std::atomic
使用
std::memory\u order\u loader
加载/存储,在C/C++中是安全的。在asm中,它在所有现代体系结构上都是安全的


在所有“正常”的CPU架构上,没有互斥锁是“安全的”,但它不提供太多的同步。由于以下限制,您只能将其用于简单的内容:

  • 如果在两次读取之间(从读者的角度来看),生产者的两个存储发生,消费者可能会错过更新。即使消费者通常比生产者快,读者也可能因为页面错误或上下文切换而睡眠。除非您在硬实时操作系统下运行,否则在这种情况下,您确实可以保证最大延迟
  • 消费者可以读取相同的值两次。如果您的数据自然不受影响(生产者从不在一行中存储相同的值两次,例如,计数器不可能在读取之间循环),那么这也不是问题

    但是,如果消费者只是在等待新值,您可能应该使用无锁队列(在固定大小的循环缓冲区中)。这使得读卡器在清空队列时可以休眠,或者生产者在填满队列时可以阻塞。它还允许消费者处理两个项目,而不需要生产商醒来一次存储一个项目。对于单生产商单消费者的情况,它可以非常有效地实现,甚至对于多编写器多读取器的情况,也可以非常有效地实现(在这种情况下,您必须阻止编写器与其他编写器竞相生成某种总订单)

    您应该只寻找一个函数的库实现,除非您真的确定要让一个读卡器在值上旋转,等待它更改

通常,此只读/写模式仅用于时间戳或某事物的“当前值”之类的内容。读者并不想看到每一个更新,他们只是在需要时阅读


在主流现代CPU架构上,对齐的字加载/存储指令是原子指令,因此您不会看到“撕裂”(来自两个不同存储的字节的混合)。有关x86的详细信息,请参阅

如果你是用asm写的,显然你必须知道机器如何工作的细节

<> >强> C或C++,当然需要使用<代码>原子>代码>代码> STD::原子< /COD>变量>,否则程序有一个未定义的行为数据竞赛。它可能会发生工作,或者共享变量的负载可能会从循环中提升出来。使用
myvar.store(newvalu,std::memory\u order\u relaxed)
将使您的加载/存储与高效的常规整数赋值非常相似。也就是说,如果您的代码恰好与
int
一起工作,那么将
std::atomic
memory\u-order\u-released
一起使用不会降低速度,甚至可能根本不会更改编译器的asm输出。(但它通过不同的周边代码或优化选项保证了正确性!)


<>遵循ISO C++ 11规则将使生产者生产者-消费者模式在任何符合C++实现上工作。在一些数据平台是硬件(不仅仅是C++优化器)的模糊平台上,您的原子变量将使用互斥而不是被锁定。:DR:如果用“代码> STD:原子< /代码>使用<代码> STD::MythyYORADORION/<代码>加载/存储,则在C/C++中是安全的。在asm中,它在所有现代体系结构上都是安全的


在所有“正常”的CPU架构上,没有互斥锁是“安全的”,但它不提供太多的同步。由于以下限制,您只能将其用于简单的内容:

  • 如果在两次读取之间(从读者的角度来看),生产者的两个存储发生,消费者可能会错过更新。即使消费者通常比生产者快,读者也可能因为页面错误或上下文切换而睡眠。除非您在硬实时操作系统下运行,否则在这种情况下,您确实可以保证最大延迟
  • 消费者可以读取相同的值两次。如果您的数据自然不受影响(生产者从不在一行中存储相同的值两次,例如,计数器不可能在读取之间循环),则这不是pr