0

我正在编写一个应用程序,该应用程序是无锁队列的实现,将在 linux 上运行并由GCC 3.4.2编译。

该实现基于以下原子操作:

__sync_fetch_and_add

__sync_fetch_and_sub

__sync_bool_compare_and_swap

__sync_val_compare_and_swap**

问题是 GCC 在GCC 4.1之前没有上述内置函数,所以目前我必须自己用汇编语言定义它们。但是我对汇编一无所知,有人能给我上述功能的定义吗?任何帮助将不胜感激。

更多信息:

/// @brief 原子地将 a_count 添加到 a_ptr 指向的变量中 /// @return 之前在内存中的值 __sync_fetch_and_add

/// @brief 原子地从 a_ptr 指向的变量中减去 a_count /// @return 之前在内存中的值 __sync_fetch_and_sub

/// @brief Compare And Swap /// 如果 *a_ptr 的当前值为 a_oldVal,则将 a_newVal 写入 *a_ptr /// @return 如果比较成功并且写入 a_newVal 则返回 true __sync_bool_compare_and_swap

/// @brief Compare And Swap /// 如果 *a_ptr 的当前值为 a_oldVal,则将 a_newVal 写入 *a_ptr /// @return *a_ptr 操作前的内容 __sync_val_compare_and_swap(a_ptr, a_oldVal, a_newVal)

4

1 回答 1

0

(未经测试,可能包含错别字):

inline long
val_compare_and_swap(volatile long *ptr, long old, long _new) {
    long prev;
    asm volatile("lock;"
#if defined(__amd64__)
                 "cmpxchgq %1, %2;"
#else
                 "cmpxchgl %1, %2;"
#endif
                 : "=a"(prev)
                 : "q"(_new), "m"(*ptr), "a"(old)
                 : "memory");
    return prev;
}

inline int
bool_compare_and_swap(volatile long *ptr, long old, long _new) {
    return val_compare_and_swap(ptr, old, new) == old;
}

inline long
fetch_and_add(volatile long *ptr, long value) {
    long prev;
    do {
        prev = *ptr;
    } until (bool_compare_and_swap(ptr, prev, prev + value));
    return prev;
}

如果您需要一个对两个字值而不是一个字值进行操作的 compare_and_swap,请参见例如http://src.chromium.org/svn/trunk/src/third_party/tcmalloc/chromium/src/base/atomicops-internals- x86.h

于 2013-01-09T14:49:27.810 回答