首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内置gcc自旋锁

内置gcc自旋锁
EN

Stack Overflow用户
提问于 2012-01-04 01:27:17
回答 2查看 2.3K关注 0票数 4

如何确保在互斥锁期间由多个CPU核心写入的数据在所有核心的所有L1缓存之间同步?我不是在谈论代表锁的变量,我是在谈论在锁期间涉及的内存位置。

这是针对Linux、x86_64的,我的代码是:

代码语言:javascript
复制
#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内核上。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-04 01:40:40

您感兴趣的是cache coherence此操作由硬件自动完成。

因此,简而言之,如果正确地使用了__sync_bool_compare_and_swap() (或任何其他锁定内在机制),则无需执行任何操作。

作为一种过于简单的解释,线程不会从对__sync_bool_compare_and_swap()的调用中返回,直到所有其他处理器都能够看到新值或者知道它们的本地副本已过期。

如果您对底层(硬件中)发生的事情感兴趣,可以使用各种缓存一致性算法来确保内核不会读取过时的数据副本。

以下是常用教学协议的部分列表:

  1. MSI
  2. MESI
  3. Firefly

现代硬件通常会有更复杂的算法。

票数 4
EN

Stack Overflow用户

发布于 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中,但在不同的硬件上,这将根据可用的指令集进行调整。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8716178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档