3

アトミック操作の実装は、組み込みの__sync_fetch_and_subない__sync_fetch_and_subGCC3.4をベースにしたアセンブリ言語で自分で書く必要があります。しかし、私は組み立てについてほとんど知りません。

誰か助けてもらえますか?どんな助けでも大歓迎です!!

これがの実装です__sync_fetch_and_add

inline unsigned int __sync_fetch_and_add(volatile unsigned int* p, unsigned int incr)
{

    unsigned int result;
    __asm__ _volatile_ ("lock; xadd %0, %1" :
            "=r"(result), "=m"(*p):
            "0"(incr), "m"(*p) :
            "memory");
    return result;
}

__sync_fetch_and_add(int *ptr, int a_count)ptrが指す変数にa_countをアトミックに追加することです。以前にメモリにあった値を返します。

__sync_fetch_and_sub(int *ptr, int a_count)ptrが指す変数からa_countをアトミックに減算することです。以前にメモリにあった値を返します。

4

1 に答える 1

5

このスニペットは、xadd:exchangeとaddのアトミックバージョンを使用します。これは、右側のオペランドを左側(ここではメモリ)にアトミックに追加し、メモリの初期値を右側のオペランドに返します。前のlockステートメントは、操作の原子性を確認します。

ただし、gccはAT&T表記を使用しているため、この説明の左右の引数(インテルのマニュアルから引用)は逆になっています。

Intelアーキテクチャに関する指示がないxsubため、これをエミュレートする最も簡単な方法は、最初に、減算する数の反対を取り、次にそれをアトミックに追加/交換することです。

inline unsigned int __sync_fetch_and_sub(volatile unsigned int* p,
    unsigned int decr)
{
    unsigned int result;

    __asm__ __volatile__ ("lock; xadd %0, %1"
            :"=r"(result), "=m"(*p)
            :"0"(-decr), "m"(*p)
            :"memory");
    return result;
}

プロパティも削除しunsignedますが、この場合は関連性がありません。

于 2013-01-10T05:44:18.690 に答える