質問

ま保存したいメモリに変換し、既存の32ビットカウンターにおける16ビットカウンタです。このカウンターは原子的に増分/減.ばんこ

  1. どの指示はいつ使ったらよいでしたatomic_inc(uint16_t x)x86/x86_64?
  2. この信頼性マルチプロセッサーのx86/x86_64す。
  3. ある性能の罰金を支払うのいずれかにこれらのアーキテクチャのために?
  4. ある場合(3)何を期待される性能す。

さんのコメント!

役に立ちましたか?

解決

ここではスティーブのDelphiの答えに代わるものとして、GCCアセンブリの拡張子を使用しています一つです

uint16_t atomic_inc(uint16_t volatile* ptr)
{
    uint16_t value(1);
    __asm__("lock xadd %w0, %w1" : "+r" (value) : "m" (*ptr));
    return ++value;
}

デクリメントするために、-1と1と++--を変更します。

他のヒント

ここで働くDelphiの機能があります:

function LockedInc( var Target :WORD ) :WORD;
asm
        mov     ecx, eax
        mov     ax, 1
   Lock xadd    [ecx], ax
        Inc     eax
end;

私はあなたが必要とどの言語に変換することができると思います。

次のように

原子増加を実行する最も簡単な方法は、(これはインラインASM)である

asm
  lock inc dword ptr Counter;
end;

Jは整数です。これは、直接そのメモリ位置にカウンターを増加します。

私は力ずくでこれをテストして、それが100%に動作します。

回答の質問:

  1. なるべく整理リストから2
  2. これがその信頼性、環境マルチプロセッサ
  3. あいの性能刑廃止
  4. の"ロック"プレフィックスのロックのバスのみならずプロセッサーはもちろん、外部ハードウェアをしたいといアクセスを経由のバスDMA(マスストレージ、グラフィックス...).でも遅いので、通常~100サイクルを引き起こす場合もあるより多額のコストがかかります。また"メガバイト"のカウンター、チャンス、直面するキャッシュ、その場合は、お待ちして~約100時計とにかく(メモリアクセス時間)の場合、ホームページへ戻るページの、数百に架からロックがどちらでも構いません。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top