0

私はアプリケーションを書いています。このアプリケーションはロックフリーキューの実装であり、Linuxで実行され、GCC3.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_ptrが指す変数にa_countをアトミックに追加します///@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;
}

1つではなく2つの単語の値で動作する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 に答える