如何确保在互斥锁期间由多个CPU核心写入的数据在所有核心的所有L1缓存之间同步?我不是在谈论代表锁的变量,我是在谈论在锁期间涉及的内存位置。
这是针对Linux、x86_64的,我的代码是:
#include <sys/types.h>
#include "dlog.h"
uint *dlog_line;
volatile int dlog_lock;
char *dlog_get_new_line(void) {
uint val;
while(!__sync_bool_compare_and_swap(&dlog_lock, 0, 1)) {
val=*dlog_line;
if (val==DT_DLOG_MAX_LINES) val=0;
*dlog_line=val;
}
dlog_lock = 0;
}在这里,在dlog_get_new_line()函数中,我使用了gcc内置函数,所以获取锁应该不会有任何问题。但是,如何确保当锁被释放时,*dlog_line指向的值传播到系统中所有其他L1核心的所有CPU缓存中呢?
我不使用pthread,每个进程运行在不同的cpu内核上。
发布于 2012-01-04 01:40:40
您感兴趣的是cache coherence。此操作由硬件自动完成。
因此,简而言之,如果正确地使用了__sync_bool_compare_and_swap() (或任何其他锁定内在机制),则无需执行任何操作。
作为一种过于简单的解释,线程不会从对__sync_bool_compare_and_swap()的调用中返回,直到所有其他处理器都能够看到新值或者知道它们的本地副本已过期。
如果您对底层(硬件中)发生的事情感兴趣,可以使用各种缓存一致性算法来确保内核不会读取过时的数据副本。
以下是常用教学协议的部分列表:
现代硬件通常会有更复杂的算法。
发布于 2012-01-04 05:29:48
Gcc还有另外两个内置组件,它们正是为您所描述的目的而发明的:__sync_lock_test_and_set和__sync_lock_release。它们有所谓的获取/释放语义,这保证了当你需要其他变量的存储值时,当你持有自旋锁时,这些值是可见的。这些需求比__sync_bool_compare_and_swap提供的要弱一些,所以最好使用为这项工作量身定做的工具。
它们应该很好地适应不同硬件的容量。例如,在我的x86_64上,这会在最终的原子存储之前将mfence指令放到dlog_lock中,但在不同的硬件上,这将根据可用的指令集进行调整。
https://stackoverflow.com/questions/8716178
复制相似问题