Контейнеры повышения для разделяемой памяти реализуют блокировку? - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь использовать библиотеку буста с ++ для создания хэш-карты в (улучшенной) папке с общей памятью.Пока все хорошо, все это хорошо описано в документации boost .Тем не менее, я хочу иметь блокировку мьютекса на создаваемой карте, но не могу понять, является ли это частью контейнера hashmap.

Я не могу найти эту информацию в документации, и, пытаясь прочитать источники повышения, я быстро заблудился, даже Google не дает ответа.Конечно, было бы легко реализовать мьютекс-блокировку с использованием библиотеки boost, но я не хочу в конечном итоге использовать механизм избыточной блокировки.

Если кто-нибудь может сказать мне, являются ли контейнеры boost, в частности, hashmap,приходят с включенной блокировкой, что было бы очень полезно.Бонусные баллы, если вы можете указать мне место на www, где я мог бы найти эту информацию сам.

Ответы [ 3 ]

0 голосов
/ 20 сентября 2018

В дополнение к ответу @sehe блокировка на уровне контейнера слишком тонкая, чтобы быть полезной.Многие операции требуют более одного вызова функций контейнера, и эти вызовы должны выполняться как одна атомарная последовательность.Например, в:

if(!container.empty()) {
    auto last = container.back();
    container.pop_back();
    // process last
}

Одна блокировка должна удерживаться во время всех трех вызовов контейнера, а не блокироваться и разблокироваться для каждого вызова.

0 голосов
/ 07 декабря 2018

У них нет встроенной синхронизации.В прошлый раз, когда я реализовал нечто похожее между Writer и Reader, процедура была такой: Writer создает сегмент общей памяти для SharedMutex и другой сегмент общей памяти для sharedVector.Writer получает адрес сегмента памяти (SharedMutex) и сохраняет эту ссылку в локальной переменной мьютекса.После этого он блокирует его и начинает записывать вектор в shMem.Как только он разблокирует мьютекс, считыватель начинает считывать значения.

В документации для буста описываются следующие строки кода:

using namespace boost::interprocess;
shared_memory_object::remove("SharedMutex");
shared_memory_object shmObj(create_only, "SharedMutex", read_write);
shmObj.truncate(sizeof(SharedMutex));
mapped_region region(shmObj, read_write);
void * addr = region.get_address();
SharedMutex * shared_mtx = new (addr) SharedMutex;
scoped_lock<interprocess_mutex> lock(shared_mtx->mutex);
//Start Writing in the Vector shared segment, SharedMutex is boost::interprocess::mutex
0 голосов
/ 20 сентября 2018

Повышающие «контейнеры для разделяемой памяти» - это просто псевдонимы для контейнеров общего назначения из Boost Container.Фактически, они становятся «для общей памяти» только при использовании с соответствующим типом (ами) распределителя.

Как таковые, они не имеют встроенной синхронизации (если, конечно, не задокументированы).

...