2

しばらくの間、怒りの中でブースト共有メモリを学習して使用していたので、どのタイプのミューテックスをいつ使用するかのメンタルモデルにたどり着きました。それは次のようになります。

class IntendedToResideInProcessMemory {
    boost::mutex mutex_for_this_process; // 1
    boost::interprocess::interprocess_mutex
        ok_but_pointless_to_use_interprocess_mutex_here; // 2
}

class IntendedToBeCreatedInSharedMemory {
    boost::mutex bad_mutex_at_a_guess_this_will_allocate_something_on_heap;// 3
    boost::interprocess::interprocess_mutex
        good_for_multiprocess_shared_lock; // 4
}

原則としてこれが間違っていないことを願っていますので、間違っている場合は修正してください。私の意図は、この図に準拠していない既存のコードと自分自身のコードを前進させて修正することですが、確実にしたいと思います。

この質問には 2 つの部分があります。本当に問題ないと思いますが、//2 を使用するのは無意味です。コンテキストでは、これは //1 よりも良くありませんが、その理由は何ですか? パフォーマンス?

//3 については、私の推測は正しいですか? 機能しない理由、または少なくともどのような状況では機能しないのか、技術的な舞台裏の理由を誰かが説明できますか?

4

1 に答える 1

3

ポイント3について:boost::mutex他のプロセスからは見えません。プロセス間ミューテックスは、別のプロセスからアクセスできるシステム グローバルに名前が付けられたオブジェクトを使用しますboost::mutex

共有boost::mutexメモリで作成されたものは、たとえば Windows ではHANDLE、プロセスのプライベート ヒープに割り当てられる Windows Mutex オブジェクトに関連付けられている場合があります。このヒープは、他のプロセスからは見えません。

boost::mutexクラスを見ると、これがありますtypedef

typedef platform-specific-type native_handle_type;これはプラットフォーム固有です。

別の例: POSIXミューテックスは、プロセス間で異なるアドレスによって識別されます。その例について@DeadMGに感謝します:)

于 2012-06-15T13:50:34.103 に答える