gpt4 book ai didi

c - 读取内存屏障如何在存在中断的情况下工作?

转载 作者:太空宇宙 更新时间:2023-11-04 04:00:15 25 4
gpt4 key购买 nike

关于内存屏障的使用,我有一些不明白的地方,我希望得到澄清。

因此,假设我们有一个 Treibers 堆栈,但我们使用的是 SMR,因此没有与每个指针关联的计数器 - 我们必须在原子操作中正确获取指针(这与 ABA 无关 - 我们是使用处理 ABA 的 SMR,这不是问题的一部分)。

现在,假设我们在 Intel (x86/x64) 上工作,因此每个 CAS 都带有完整的内存屏障。我认为当 CASing 是缓存行被锁定时会发生什么,发出读屏障,清除无效队列,缓存行因此加载最新版本的缓存行,比较发生,然后发出写屏障,刷新存储缓冲区,最后我们释放缓存行锁。

因此,我们有以下用于弹出的代码;

BARRIER_PROCESSOR_READ;

original_top = stack_state->top;

do
{
if( original_top == NULL )
return( 0 );

copy_of_original_top = original_top;

original_top = compare_and_swap( &stack_state->top, original_top->next, original_top );
}
while( copy_of_original_top != original_top );

*user_data = original_top->user_data;

所以,我们首先发出一个读屏障——这确保我们刷新我们的无效队列。但是这样做和读取 state_state->top 之间存在差距。在清除无效队列和读取 state_stack->top 之间,任何事情都可能发生。核心可以处理中断,有总线争用并且非常慢,你可以命名 - 可以重新加载无效缓存行(并由另一个处理器重新无效)。基本上 - 无效队列可以重新填充。这意味着我们实际上不能相信 original_top 的值;我们可能正在读取一个实际上是错误的本地缓存行(我们还没有使它无效)并且通过这样做,错误地认为它的值为 NULL 并返回 0。

所以基本上,我看不到读取障碍如何帮助,因为在障碍之后但在您希望执行的实际读取之前,任何事情仍然可能发生。

我在这里错过了什么?

最佳答案

我没有完全理解你的问题,但我强烈怀疑你遗漏了一个细节。

内存防护用于保证更改的可见性,而不是同步进程。单独的防护并不能锁定对数据的访问。

另一方面,原子操作和锁(如互斥量或临界区或信号量或任何其他同步原语)都将保证只有一个线程访问给定的内存区域(假设所有访问都被编码为发生在你'拥有'这样的锁或原子)。但它们不能保证有序的可见性。

您需要两者独占访问防护,如果您需要两者(注意:防护通常已经作为高级同步原语(如互斥体)的一部分实现,因此如果您使用那些您不必明确担心防护的那些)。

关于c - 读取内存屏障如何在存在中断的情况下工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12529400/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com