Можно ли использовать условие boost spin_condition для синхронизации процессов?

#c #boost

#c #повышать

Вопрос:

Я вижу ниже код в interprocess_condition , я знаю, что interprocess_condition используется для синхронизации процессов, но я не уверен spin_condition , может ли это быть.

 private:  #if defined(BOOST_INTERPROCESS_CONDITION_USE_POSIX)  ipcdetail::posix_condition m_condition;  #elif defined(BOOST_INTERPROCESS_CONDITION_USE_WINAPI)  ipcdetail::winapi_condition m_condition;  #else  ipcdetail::spin_condition m_condition; // this condition  #endif  

сомнение

Потому что я обнаружил, что spin_condition это реализовано через переменную ключевого слова volatile. Могут ли переменные с изменчивыми ключевыми словами использоваться в качестве общей памяти между процессами?

 spin_mutex m_enter_mut;  volatile boost::uint32_t m_command;  volatile boost::uint32_t m_num_waiters;  

Ответ №1:

Оно может. Память-это просто память, память.

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

Однако, если конфликт блокировок не является очень редким, спин-блокировка без отключения приводит к очень неэффективному энергопотреблению и пропускной способности. В качестве альтернативы, если вас не беспокоит эффективность, но вы заботитесь об абсолютной задержке, вам придется строго контролировать планирование потоков (сколько потоков сосуществует на одном компьютере/узле NUMA/…, сходство потоков, приоритет потоков и параметры планирования в реальном времени, чтобы назвать несколько). На практике у вас не будет такого контроля, если вы уже не знали ответов на свой вопрос, поэтому рекомендуется избегать синхронизации только с блокировкой вращения.