Я пытаюсь создать класс, управляющий вектором (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);
}
}
Клиент успешно добавляет строку в вектор (ему также удается прочитать эту строку из буфера для отладки), менеджер (код выше) получает сигнал (переменная condtion), пишет, что в векторе есть строка (строка 27 ), но когда он пытается получить эту строку через at()
, приложение вылетает.
Изменить: Я понял, что использование
std::string
невозможно, для этого случая есть контейнер string
в boost ipc. Это не меняет того факта, что мне нужен вектор строк (boost / std) ...
В: Как передать строки через общую память? Мне нужно сохранить их в некотором буфере (способном хранить> 1 за раз) в shmem, а затем получить второй процесс - это требование. Вход всегда std::string
, как и выход, но внутреннее представление в shmem может быть другим.
at()
, ноat()
принимает толькоstd::vector<T>::size_type
. Даже если бы этот код компилировался (а не компилировался), это не имело бы смысла. Также немного странно, чтоlog.debug()
возвращает lvalue, которое должно использоваться таким образом ... зачем вам передавать аргумент? - person Ed S.   schedule 19.10.2012wait
ing по условию, он получает все новые строки, обрабатывает их и удаляет из вектора. Потом сноваwait
.. - person emesx   schedule 23.10.2012