【问题标题】:Can I wrap gcc's atomic built-ins?我可以包装 gcc 的原子内置函数吗?
【发布时间】:2014-02-07 07:09:22
【问题描述】:

如果线程与 Pthread 互斥锁/自旋锁同步,则可以轻松地包装对pthread_mutex_lock()pthread_mutex_unlock() 的调用,例如,使用LD_PRELOAD。这对于记录/调试非常有用。

是否可以使用 gcc 的 atomic built-ins 做类似的事情,例如__sync_fetch_and_add

我想我无法与我们联系LD_PRELOAD,但也许还有其他一些机制。

【问题讨论】:

  • 内部函数直接转化为机器指令。它们不是库函数调用。
  • 是的,我知道这一点。但也许 gcc 提供了一些编译标志或其他方法来包装这些函数。
  • 请注意,__sync 内置函数是“遗留”的。考虑更新的 __atomic 内置函数。

标签: c gcc atomic word-wrap built-in


【解决方案1】:

我认为这是可能的,使用像 Intel 的 PIN (User Guide) 这样的检测 API。例如,您可以首先检测所有使用INS_IsAtomicUpdate 执行原子更新的指令,然后添加更多排除标准以启发式地定位__sync_fetch_and_add 生成的指令。

或者,您可以在每个 __sync_fetch_and_add 之前安装一系列带有 asm volatile 块的 NOP,专门查找该指令序列,并检测随后的机器代码(这必然是为 @987654326 生成的代码@)。

【讨论】:

  • 这是一种可能的解决方案,但需要始终在 Pin 之上运行应用程序。 (我喜欢 NOPs 序列技巧。)
  • 我很确定您不需要将任何对 PIN 的依赖项注入到您的应用程序中。我主要担心的是 NOP 块可能会影响性能,所以我只会将它们放在调试版本中。
  • 是的,我看到了与 NOP 相同的问题。我对 Pin 的担忧是,如果您想在部署中获得调试信息,则需要将 Pin 与应用程序一起提供,以便在那里执行。所以我更喜欢有一个 gcc 选项,它允许我用应用程序编译包装器。除此之外,我喜欢这个解决方案。
  • 好的,因为没有其他答案出现,我假设不能直接使用编译器标志/选项。那么这是一个不错的选择。
猜你喜欢
  • 2023-01-04
  • 1970-01-01
  • 2013-03-28
  • 1970-01-01
  • 1970-01-01
  • 2015-06-20
  • 1970-01-01
  • 2011-12-01
  • 1970-01-01
相关资源
最近更新 更多