#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/…, сходство потоков, приоритет потоков и параметры планирования в реальном времени, чтобы назвать несколько). На практике у вас не будет такого контроля, если вы уже не знали ответов на свой вопрос, поэтому рекомендуется избегать синхронизации только с блокировкой вращения.