在 GCC 中实现通用原子加载或存储的更好方法?

发布于 2024-07-17 21:04:26 字数 738 浏览 8 评论 0原文

我知道 GCC 的内置原子操作: http:// gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Atomic-Builtins.html

但此列表不包括非常简单的操作,例如加载和存储。 我可以通过内联汇编在有限的架构上实现这些(事实上对于许多像 x86 的架构来说,它们基本上只是常规的 mov),但是在一般情况下没有比这样更好的方法了:

// returns the value at ptr
void *atomic_load_ptr(void **ptr)
{
    return __sync_fetch_and_add(ptr, 0);
}

// returns old value int ptr after setting it to newval
void *atomic_store_ptr(void **ptr, void *newval)
{
    void *oldval = atomic_load_ptr(ptr)
    void *oldval2;
    do {
        oldval2 = oldval;
    } while ((oldval = __sync_val_compare_and_swap(ptr, oldval, newval)) != oldval2);
    return oldval;
}

I am aware of GCC's builtin atomic operations: http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Atomic-Builtins.html

But this list doesn't include very simple operations like load and store. I could implement these on limited architectures with inline assembly (in fact for many like x86 they will be basically just regular mov's), but is there no better way in the general case than something like this:

// returns the value at ptr
void *atomic_load_ptr(void **ptr)
{
    return __sync_fetch_and_add(ptr, 0);
}

// returns old value int ptr after setting it to newval
void *atomic_store_ptr(void **ptr, void *newval)
{
    void *oldval = atomic_load_ptr(ptr)
    void *oldval2;
    do {
        oldval2 = oldval;
    } while ((oldval = __sync_val_compare_and_swap(ptr, oldval, newval)) != oldval2);
    return oldval;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

左耳近心 2024-07-24 21:04:26

您可以使用 test_and_set 实现低级互斥锁。 在我看来,加载函数是一个很好的函数,但是存储函数应该使用 test_and_set 而不是必须

while ((oldval = __sync_val_compare_and_swap(ptr, oldval, newval)) != oldval2);

防止错误。

You could implement low level mutex with test_and_set. The load function is a good one imo, but you store function should use test_and_set instead of having

while ((oldval = __sync_val_compare_and_swap(ptr, oldval, newval)) != oldval2);

to prevent errors.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文