共有メモリ セグメントを作成しようとしているコードがいくつかあります。このセグメントは、クラス内から管理されます。共有セグメントは「掲示板」方式で使用されます。つまり、この 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 システムにコピーし、問題なくビルドして実行したことです。私は何が欠けていますか?
助けてくれてありがとう、アンディ