0

データが定期的に更新されるユースケースがあります。ただし、データを読み取る複数のスレッドがあります。したがって、私たちが考えている解決策は、ダブル バッファを使用することです。したがって、プロデューサーがバックグラウンド ページを更新している間、コンシューマー スレッドはフォアグラウンド ページを読み取ります。プロデューサーがバックグラウンド ページを更新すると、 lock を取得せずにフォアグラウンド ページをこのページと交換します。データが同じであろうと異なっていようと、操作には影響しないので気にしません。問題は、同じジョブに2つのバッファを使用して物事を回転させ続けることができる従来の生産者消費者の問題を知っているので、仕事をする方法ですが、スワップする問題はロックが必要ですが、それが私たちが望んでいることです避けるために。

それで、物事をどのように実行するか。この点でのポインタは素晴らしいでしょう。

4

1 に答える 1

1

技術的には、実際の交換は次の方法で実行できます。

  • C++11 アトミック関数 - 例std::atomic_echange:std::atomic_exchange_explicit
  • インライン アセンブリ - 例: Intellock xchg
  • GCC 組み込み関数 -__atomic_exchangeまたはそれ以前__sync_lock_test_and_set
  • MSVC 関数 -InterlockedExchangePointer
于 2012-11-30T13:41:24.443 に答える