Есть ли «upgrade_to_unique_lock» для boost :: interprocess? - PullRequest
4 голосов
/ 11 ноября 2010

Я ищу наилучший способ эффективного распределения порций данных между двумя (или более) процессами в модели с поддержкой записи / записи для чтения / записи.

Мои текущие тесты с boost::interprocess. Я создал managed_shared_memory и пытаюсь заблокировать доступ к блоку данных с помощью мьютекса межпроцессного режима, хранящегося в общей памяти.

Однако даже при использовании sharable_lock на считывателе и upgradable_lock на записывающем устройстве клиент будет читать фрагментированные значения во время операций записи вместо блокировки . Выполняя аналогичную настройку чтения / записи между потоками в одном процессе, я использовал upgrade_to_unique_lock для решения этой проблемы. Тем не менее, я не нашел его boost::interprocess эквивалент. Существует ли один?

Сервер (писатель):

while (1) {
  // Get upgrade lock on the mutex
  upgradable_lock <MutexType> lock(myMutex);

  // Need 'upgrade_to_unique_lock' here so shared readers will block until
  // write operation is finished.

  // Write values here
}

Клиент (читатель)

while (1)
{
  // Get shared access
  sharable_lock <MutexType> lock(myMutex);

  // Read p1's data here -- occasionally invalid!
}

Я думаю, что главный вопрос под рукой таков: является ли межпроцессный мьютекс даже правильным способом доступа к разделяемой памяти между процессами в настройке с поддержкой записи?

Примечание: использование Boost 1.44.0

Ответы [ 2 ]

3 голосов
/ 11 ноября 2010

Все обновляемые блокировки Boost.Interprocess поддерживают обновление на это .Определение здесь .

По поводу вашего более широкого вопроса - я думаю, что это именно то, что вы хотите.Считыватели могут работать одновременно, и вы должны предотвратить одновременную запись.Если вы не можете разделить разделяемую память так, чтобы гарантировать более ограниченный доступ, это выглядит лучше.

0 голосов
/ 29 августа 2017

Решение с помощью OP.

Ответ, как указано в комментариях к вопросу, заключается в использовании функции-члена unlock_upgradable_and_lock.Если есть boost::interprocess аналог upgrade_to_unique_lock, я не знаю, где он.Но функцию writer() можно переписать так:

while (1) {
  // Get upgrade lock on the mutex
  myMutex.lock_upgradable();

  // Get exclusive access and block everyone else
  myMutex.unlock_upgradable_and_lock();

  // Write values here

  // Unlock the mutex (and stop blocking readers)
  myMutex.unlock();
}
...