【发布时间】:2012-10-10 10:47:39
【问题描述】:
我正在尝试创建一个类来管理 (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 的使用是不可能的,boost ipc 中有一个 string 容器仅用于这种情况。这并没有改变我需要一个 (boost/std) 字符串向量的事实......
问:我如何在共享内存中传递字符串?我需要将它们存储在 shmem 中的某个缓冲区(一次能够存储 >1 个)中,并且然后在第二个过程中获取 - 这就是要求。输入总是std::string,输出也是,但在shmem中的内部表示可能不同。
【问题讨论】:
-
在哪里声明了“i”?你不是要使用它吗?
-
不,只是一个愚蠢的错字。固定。
-
@elmes:还是错了,你将迭代器传递给
at(),但at()只需要std::vector<T>::size_type。即使该代码可以编译(它不会),它也没有任何意义。同样奇怪的是,log.debug()返回了一个本来应该以这种方式使用的左值……你为什么要传递一个参数? -
1.它必须是向量吗? 2. 共享内存是否需要保存字符串或者是否足以保存指向字符串的指针? 3. 你需要并发访问吗(我假设不是因为你使用互斥锁)? 4. 代码需要跨平台吗?您现在可能知道标准迭代器不是线程安全的。如果您能回答以上问题,我可以提供解决方案。
-
1.不一定,但随机访问是的。 2. 我有一个用例,输入时我有std::string,输出时需要std::string(第二个进程) 3. 我不能禁止并发使用。互斥是用于条件的,条件是不浪费cpu时间(而是等待消费者进程中的另一个输入) 4.是的!
标签: c++ boost shared-memory boost-interprocess