У нас есть некоторые структуры данных, которые мы разделяем между процессами в Windows. (Через разделяемый сегмент данных в DLL, которая загружается всеми этими процессами.)
Нам нужно синхронизировать некоторые обращения, и мы измерили, что снижение производительности при использовании Win32 Mutex слишком дорого.
CRITICAL_SECTION
не могу быть помещенным в разделяемую память из-за некоторых ее расширенных функций.
Это оставляет нас с требованием простого решения блокировки / мьютекса, основанного непосредственно на Interlocked*
семейство функций на Win32.
Прежде чем приступить к выполнению своих собственных задач, я хотел бы посмотреть, существуют ли надежные реализации, удовлетворяющие требованию быть легковесным, быстрым и работать в общей памяти для нескольких процессов, но мне кажется, что это немного сложно для меня. (И в любом случае, CodeProject попадает, ну, часто трудно сказать, является ли это игрушечным кодом или «надежным».)
Так что то, что мне нужно, вероятно, можно назвать рекурсивный мьютекс в пользовательском режиме, который работает для нескольких процессов при помещении в общую память в Windows (обратите внимание, что только блокирующая часть должна обрабатываться безопасно, я могу жить с ограничениями / дополнительными требованиями для инициализации).
Общая память — популярная тема в настоящее время,
Попробуйте 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?
Других решений пока нет …