(std) 文字列の共有メモリ ベクトルを管理するクラスを作成しようとしています。
typedef boost::interprocess::allocator<std::string, boost::interprocess::managed_shared_memory::segment_manager> shmem_allocator;
typedef boost::interprocess::vector<std::string, shmem_allocator> shmem_vector;
shmem_mgr::shmem_mgr() :
shmem_(create_only, SHMEM_KEY, SHMEM_SIZE),
allocator_(shmem_.get_segment_manager())
{
mutex_ = shmem_.find_or_construct<interprocess_mutex>(SHMEM_MUTEX)();
condition_ = shmem_.find_or_construct<interprocess_condition>(SHMEM_CONDITION)();
//buffer_ is of type shmem_vector
buffer_ = shmem_.construct<shmem_vector>(SHMEM_BUFFER_KEY)(allocator_);
}
void shmem_mgr::run() {
running_ = true;
while(running_) {
scoped_lock<interprocess_mutex> lock ( *mutex_ );
int size = buffer_->size();
log_.debug() << size << " queued request(s) found" << std::endl; //LINE 27
for(int i=0; i<size; i++) {
log_.debug() << buffer_->at(i); // at() crashes my app
}
buffer_->clear(); //so does clear()
condition_->wait (lock);
}
}
クライアントは文字列をベクターに正常に追加し (デバッグのためにバッファーからその文字列を読み取ることにも成功します)、マネージャー (上記のコード) はシグナル (条件変数) を受信し、ベクターに文字列があることを書き込みます (27 行目)、しかしat()
、アプリケーションを介してその文字列を取得しようとするとクラッシュします。
編集:私は、の使用
std::string
が不可能であることを理解しましたstring
。この場合のためだけに、boost ipc にコンテナーがあります。これは、(boost/std) 文字列のベクトルが必要であるという事実を変更しません...
Q :共有メモリ間で文字列を渡すにはどうすればよいですか? それらをshmemのバッファ(一度に1つ以上格納できる)に格納し、2番目のプロセスでフェッチする必要があります-それが要件です。入力と出力は常にstd::string
同じですが、shmem の内部表現は異なる場合があります。