7

Windowsのプロセス間で共有しているデータ構造がいくつかあります。(これらすべてのプロセスによってロードされるDLLの共有データセグメントを介して。)

一部のアクセスを同期する必要があり、Win32Mutexを使用した場合のパフォーマンスへの影響はコストがかかりすぎると測定しました。

CRITICAL_SECTION 一部の高度な機能のため、共有メモリに入れることはできません。

Interlocked*これにより、Win32の関数ファミリに直接基づく単純なロック/ミューテックスソリューションが必要になります。

自分でロールする前に、軽量で高速で、複数のプロセスの共有メモリで動作するという要件を処理する堅牢な実装があるかどうかを確認したいと思いますが、これは私にとっては少し難しいことのようです。(そして、とにかく、CodeProjectはヒットしますが、それがおもちゃのコードなのか「堅牢」なのかを判断するのは難しいことがよくあります。)

したがって、私が必要とするのは、Windowsの共有メモリに配置されたときに複数のプロセスで機能するユーザーモードの再帰ミューテックスと呼ばれる可能性があります(ロック部分のみを節約して処理する必要があることに注意してください。初期化)。

4

1 に答える 1

1

共有メモリは現在人気のあるトピックですが、

boost :: InterProcessを試してください-使用できるメカニズムを提供し、一般的なコードx-platformを利用します。

http://www.boost.org/doc/libs/1_52_0/doc/html/interprocess/sharedmemorybetweenprocesses.html

もう1つの理由は、ライブラリが同期のためのメカニズムおよび将来役立つ可能性のある他のIPCメカニズムを提供することです。

http://www.boost.org/doc/libs/1_52_0/doc/html/interprocess/synchronization_mechanisms.html

参考までに、ミューテックスにもAtomicOPを使用します。

http://www.boost.org/doc/libs/1_52_0/boost/interprocess/sync/spin/mutex.hpp

inline void spin_mutex::lock(void)
{
   do{
      boost::uint32_t prev_s = ipcdetail::atomic_cas32(const_cast<boost::uint32_t*>(&m_s), 1, 0);

      if (m_s == 1 && prev_s == 0){
            break;
      }
      // relinquish current timeslice
      ipcdetail::thread_yield();
   }while (true);
}

また、この投稿の「以下のチャット」から、次のトップアンサーを見てください 。Boostのスコープ付きミューテックスとWinAPiのクリティカルセクションに違いはありますか?

于 2012-11-23T15:50:04.173 に答える