Надежный CRITCAL_SECTION для разделяемой памяти?

У нас есть некоторые структуры данных, которые мы разделяем между процессами в Windows. (Через разделяемый сегмент данных в DLL, которая загружается всеми этими процессами.)

Нам нужно синхронизировать некоторые обращения, и мы измерили, что снижение производительности при использовании Win32 Mutex слишком дорого.

CRITICAL_SECTION не могу быть помещенным в разделяемую память из-за некоторых ее расширенных функций.

Это оставляет нас с требованием простого решения блокировки / мьютекса, основанного непосредственно на Interlocked* семейство функций на Win32.

Прежде чем приступить к выполнению своих собственных задач, я хотел бы посмотреть, существуют ли надежные реализации, удовлетворяющие требованию быть легковесным, быстрым и работать в общей памяти для нескольких процессов, но мне кажется, что это немного сложно для меня. (И в любом случае, CodeProject попадает, ну, часто трудно сказать, является ли это игрушечным кодом или «надежным».)

Так что то, что мне нужно, вероятно, можно назвать рекурсивный мьютекс в пользовательском режиме, который работает для нескольких процессов при помещении в общую память в Windows (обратите внимание, что только блокирующая часть должна обрабатываться безопасно, я могу жить с ограничениями / дополнительными требованиями для инициализации).

6

Решение

Общая память — популярная тема в настоящее время,

Попробуйте boost :: InterProcess — который предоставляет механизмы, которые можно использовать, и использует общую кодовую платформу x.

http://www.boost.org/doc/libs/1_52_0/doc/html/interprocess/sharedmemorybetweenprocesses.html

Другая причина в том, что библиотека предоставляет механизмы для синхронизации и другие механизмы IPC, которые могут быть полезны в будущем.

http://www.boost.org/doc/libs/1_52_0/doc/html/interprocess/synchronization_mechanisms.html

Для справки эта штука использует также атомные OP для мьютекса:

http://www.boost.org/doc/libs/1_52_0/boost/interprocess/sync/spin/mutex.hpp

inline void spin_mutex::lock(void)
{
do{
boost::uint32_t prev_s = ipcdetail::atomic_cas32(const_cast<boost::uint32_t*>(&m_s), 1, 0);

if (m_s == 1 && prev_s == 0){
break;
}
// relinquish current timeslice
ipcdetail::thread_yield();
}while (true);
}

Также из «чата ниже» этот пост посмотрите на верхний ответ для:
Есть ли разница между мьютексом Boost и критическим разделом WinAPi?

1

Другие решения

Других решений пока нет …