假设你有一个内存中的字符串列表,以及一个多线程系统,有许多读者但只有一个编写器线程.
一般来说,是否可以在C#中实现这种系统而不使用锁?实现是否会对线程如何交互做出任何假设(或者限制它们可以做什么,何时做)?
我很困惑,微软表示InterlockedExchange需要内存对齐,但是,英特尔文档说LOCK不需要内存对齐.我错过了什么,或者其他什么?谢谢
Platform SDK:DLL,进程和线程InterlockedExchange
Target参数指向的变量必须在32位边界上对齐 ; 否则,此函数将在多处理器x86系统和任何非x86系统上出现不可预测的行为.
LOCK指令在执行伴随指令期间使处理器的LOCK#信号有效(将指令转换为原子指令).在多处理器环境中,LOCK#信号确保处理器在信号被置位时独占使用任何共享存储器.
LOCK前缀的完整性不受存储器字段对齐的影响. 对于任意未对齐的字段,观察到存储器锁定.
P6中的内存排序和更新的处理器系列
锁定的指令有一个总订单.
软件控制总线锁定
总线锁的完整性不受存储器字段对齐的影响.遵循LOCK语义以获得更新整个操作数所需的多个总线周期.但是,建议锁定访问在其自然边界上对齐,以获得更好的系统性能:•8位访问的任何边界(锁定或其他).•锁定字访问的16位边界.•锁定双字访问的32位边界.•锁定四字访问的64位边界.