5

共有メモリ セグメントを作成しようとしているコードがいくつかあります。このセグメントは、クラス内から管理されます。共有セグメントは「掲示板」方式で使用されます。つまり、この 1 つのプロセスがそれに書き込み、他の多くのプロセスがそこから読み取ります。難しい話は抜きにして:

#include <string>
#include <sys/types.h>
#include <boost/interprocess/managed_shared_memory.hpp>

static const std::string SHM_NAME("SharedMemory");
static const std::string SHM_STATUS("StatusArray");
static const std::string SHM_INFO1("MfgData");

class Manager {
    u_int8_t* _status;
    char* _info;

    boost::interprocess::managed_shared_memory _shm;

    Manager()
        : _shm(boost::interprocess::create_only, SHM_NAME.c_str(), 1024)
    {
        // the process goes out to lunch on this first call, it's like a deadlock
        status = _shm.construct<u_int8_t>(SHM_STATUS.c_str()) [128] (0); // array 128 bytes, init to 0
        info = _shm.construct<char>(SHM_INFO1.c_str()) [256] (0);
    }

public:
    ~Manager() {
        _shm.destroy<u_int8_t>(SHM_STATUS.c_str());
        _shm.destroy<char>(SHM_INFO1.c_str());
        boost::interprocess::managed_shared_memory_object::remove(SHM_NAME.c_str());
    }

    Manager* Builder() {
        // just in case a previous instance was abnormally terminated
        boost::interprocess::managed_shared_memory_object::remove(SHM_NAME.c_str());
        return new Manager(); // sort of a factory pattern
    }
};

これを行う方法についてブースト Web サイトから行った読み取りは、デッドロックがある可能性があることを示唆しています。実際、それが私が ctor を private セクションに入れ、builder 関数を作成した理由です: 構築中に以前のインスタンスを削除できるようにするためです。ただし、これは問題を軽減しませんでした。

使用されないように共有メモリ セグメントの名前を変更しようとしましたが、それでも、それらのコード行に到達するとプロセスがハングします。

モデルにこのリンク(および同じドキュメント サイトの他のリンク) を使用しています。この時点で、私には 2 番目の目が必要です。できれば、プロセス間ブーストと共有メモリの経験豊富な目が必要です。

ところで、私が提供したそのリンクから使用しているプログラム モデルは、「名前付き共有メモリ」プログラムです。非常に腹立たしいのは、そのプログラムを Linux システムにコピーし、問題なくビルドして実行したことです。私は何が欠けていますか?

助けてくれてありがとう、アンディ

4

1 に答える 1

1

この問題は、この時点でブーストに関連していない何かに関連しているようです. 私が最初に問題に遭遇したとき、これがまさにハングアップが発生していた場所だったので、私は質問をして、そのようにタグを付けました。ハングアップは、プロセス間通信のためにブースト ライブラリの奥深くに埋め込まれたミューテックスのブロック要求によるものだと思います。私が持っているコード構造は、ctor を非公開にしてファクトリー関数を呼び出すことで、その問題を軽減したと思います。

ブライアンの素晴らしい提案のおかげで、問題がどこにあるかを瞬時に確認することができました。この場合の問題は、以前に作成した fifo を開くときに、非ブロッキングのオプションがフラグに組み込まれておらず、別のパーティが書き込みのために同じパイプを開くのを待ってプロセスがブロックされていたことです。

于 2013-04-18T20:54:22.540 に答える