共享内存的原子,原子函数,汇编,同行评审[关闭]

问题描述 投票:-1回答:1

背景很长,所以问题很有意义...

在6.7中,可以使用g_atomic子例程(libglib中的gatomic.h和gatomic.c在共享内存中完成Centos信号量。

这些在6.9及更高版本中不再存在于libglb中,您无法使用这些例程进行编译。但是6.7版的可执行文件可以完美运行。

所以我在github上寻找源代码。他们只有一个版本,我从那个来源看不到它是如何工作的。它在那里具有相同的功能3次(不适用于#if)。它具有如下所示的选择代码:

 void                                        
    (g_atomic_int_inc) (volatile gint *atomic)  
{                                           
    g_atomic_int_inc (atomic);                
}                                           

我认为这会在运行时做非常奇怪的事情:-)核心转储?

所以我试图提取碎片。它使用pthreads和互斥函数。应该可以,但是即使使用pthread的非阻塞调用,它也会被适当地阻塞。

[确定-玩得开心吗?我跟踪了许多(8+)汇编程序原子函数。八号实际工作。我不知道它是如何工作的,但是它可以通过我的测试计算机和VM上的所有测试。奇怪的是,编码被列为486代码。大多数站点都说汇编器通过锁定总线来与共享内存中的多个内核/ cpu一起工作。 VM上的“总线”是什么?

这里是汇编代码:

int metasm_int_exchange_and_add(volatile int *atomic,int val)      
{                                                                  
  int result;                                                      

      __asm__ __volatile__ ("lock; xaddl %0,%1"                        
                    : "=r" (result), "=m" (*atomic)            
                    : "0" (val), "m" (*atomic));               
  return result;                                                   
}                                                                  

无论如何,我有三个问题,希望得到同行的评论和/或提出更好的建议:1)该汇编代码实际上是做什么的(我知道功能,但是如何)?2)它可能适用于更新的内容?3)对吗,还有什么更好的方法?

非常感谢,并随时提出有效的代码:-)

Eric

c assembly centos atomic
1个回答
0
投票

xadd指令需要486 或更高版本,而不是386,因此如果您关心32位模式,则值得一提。

lock前缀如何构成原子RMW:请参阅Can num++ be atomic for 'int num'?是的,x86手册保证它可以工作,因此将来可以证明。


您不需要,也不应该为此使用嵌入式asm;使用GNU C原子内置函数,例如

type __atomic_fetch_add (type *ptr, type val, int memorder);

例如

int fetch_add(volatile int *atomic,int val) {
    return __atomic_fetch_add(atomic, val, __ATOMIC_SEQ_CST);
}

这可移植到GCC支持的所有ISA。 (假定alignof(int) = alignof(_Atomic int)或原子性的实际对齐要求是什么-内建函数都假定其操作数正确对齐。)

在普通volatile int*而不是C11 _Atomic int或C ++ 11 std::atomic<int>上进行操作,使其类似于C ++ 20 std::atomic_ref


更通常情况下,您应该只使用C11 _Atomic int(aka atomic_int)。 https://en.cppreference.com/w/c/atomic

© www.soinside.com 2019 - 2024. All rights reserved.