2009-04-24 1 views
3

私は、x86プラットフォーム(Pentium以上の保証付き)で64b整列64bデータのアトミックリードを実行したいと思います。x86(Pentium以上)で原子64bを読む方法は?

これを行う方法はありますか? (そして、いいえ、クリティカルセクションやミューテックスを使用したくないので、ロックフリーにしておきたいです)。

+0

ご確認ください - あなたは64ビットまたはバイトを意味しますか? – Alnitak

+1

私はそれが64ビットだと仮定しています。バイトは本当に意味をなさないでしょう。 – Zifre

+0

win32タグを持つのではなく、テキストでWindowsを記述した方が良いでしょう。私はタグが自分自身の情報ではなく、検索の助けになると見ています。 –

答えて

4

は、インターロック操作を使用して、ここではいくつかのサンプルコードです。 InterlockedCompareExchangeは、pが指す元の64ビット値を返します。

+0

InterlockedAdd()は0を追加する方が良い - CASはもっと多くの作業を行い、より多くのサイクルを使います。 –

+1

MSDNによると、InterlockedAddはItaniumでのみサポートされています。 x86でも、ロックの追加は32ビットの読み取りだけです。 – Michael

+0

私は、InterlockedAdd64を意味します。 – Michael

0

インターロックされた*()関数を使用します。

には、読み取り自体ありません - しかし、あなたは0

+1

なぜ彼はWindowsを使用していると思いますか? – Zifre

+0

x86にインターロックされたAdd、Or/Xorがない、_InterlockedCompareExchange64のみ - Zifreの回答を参照 – Suma

+1

質問は現在「win32」と表示されているので、Windowsの機能が受け入れ可能であると想定するのは安全だと思います。 –

6

This pageはそれを行う方法について説明を追加add()を発行することができます。基本的にはlock cmpxchg8bを使用するだけです。

LONGLONG AtomicRead(LONGLONG* p) 
{ 
    return InterlockedCompareExchange64(p, 0, 0); 
} 

それはすでにゼロ-ieに等しいだ場合、これはゼロに対して交換を比較し、ゼロにPを設定しないが、それはNOOPです:

+0

C++、asmではない - 彼はOSが提供するラッパーを望んでいる。 –

+1

@Bank Xavier、なぜ彼はOSにラッパーを提供したいと思う?そして、あなたはどのOSを使用しているのか、どのように知っていますか? – Zifre

+0

C++タグ。私はOSを知らないので、インターロッキングされた*()提案は役に立ちません。 –

関連する問題