8

InterlockedCompareExchangeRelease()との違いは何InterlockedCompareExchangeAcquire()ですか?

WIN32 APIを使用して同期関数を学習しようとすると、名前が異なる2つの関数がありますが、同じことをしているようです。

LONG __cdecl InterlockedCompareExchangeRelease(
  __inout  LONG volatile *Destination,
  __in     LONG Exchange,
  __in     LONG Comparand
);

LONG __cdecl InterlockedCompareExchangeAcquire(
  __inout  LONG volatile *Destination,
  __in     LONG Exchange,
  __in     LONG Comparand
);

私はMSDNをチェックします、それはそれらの関数が次のとおりであると言います:

指定された値に対してアトミックな比較交換操作を実行します。この関数は、指定された2つの32ビット値を比較し、比較の結果に基づいて別の32ビット値と交換します。

しかし、のためInterlockedCompareExchangeAcquire()に、

この操作は、メモリアクセスの取得セマンティクスを使用して実行されます。

とのためInterlockedCompareExchangeRelease()に、

交換は、リリースメモリアクセスセマンティクスを使用して実行されます。

ですから、これら2つの機能の違いに興味があります。いつメモリアクセスセマンティクスを取得するか、メモリアクセスセマンティクス解放するか。例はありますか?

ありがとう!

4

2 に答える 2

10

プレーンバージョンは完全なバリアを使用しますが、接尾辞バージョンはロードまたはストアのみを処理します。これは、一部のCPU(Itaniumベースのプロセッサなど)でより高速になる可能性があります。

MSDNには、セマンティクスの取得と解放Interlocked * APIに関する記事と、このすばらしいブログ投稿があります。Linuxのメモリバリアのドキュメントも役立つかもしれません...

于 2012-03-19T02:37:18.853 に答える
1

私はこれこれをMSDNで見つけました:

メモリーの取得セマンティクスは、他のメモリー操作が試行される前に、現在のスレッドによって実行されているメモリー操作が表示されることを指定します。リリースメモリセマンティクスは、現在のスレッドによって実行されているメモリ操作が、他のすべてのメモリ操作が完了した後に表示されることを指定します。これらのセマンティクスを使用すると、メモリ操作を特定の順序で強制的に実行できます。保護された領域に入るときは取得セマンティクスを使用し、保護領域を出るときは解放セマンティクスを使用します。

于 2012-03-19T02:29:50.253 に答える