boost spin_condition 可以用于进程同步吗?
Can boost spin_condition be used for process synchronization?
我在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关键字变量实现的。 volatile关键字变量可以作为进程间的共享内存吗?
spin_mutex m_enter_mut;
volatile boost::uint32_t m_command;
volatile boost::uint32_t m_num_waiters;
可以。记忆就是这样,记忆。
如果在进程之间共享它,就该内存位置而言,它会有效地使来自不同进程的线程表现得像来自同一进程的线程。
但是,除非锁争用非常罕见,否则没有回退的自旋锁会导致功耗和吞吐量效率非常低。或者,如果您不关心效率但关心绝对延迟,则必须严格控制线程调度(有多少线程共存于同一个 machine/NUMA 节点/...、线程亲和性、线程优先级和实时调度选项等等)。实际上,除非您已经知道问题的答案,否则您不会拥有该控制权,因此建议必须远离仅自旋锁同步。
我在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关键字变量实现的。 volatile关键字变量可以作为进程间的共享内存吗?
spin_mutex m_enter_mut;
volatile boost::uint32_t m_command;
volatile boost::uint32_t m_num_waiters;
可以。记忆就是这样,记忆。
如果在进程之间共享它,就该内存位置而言,它会有效地使来自不同进程的线程表现得像来自同一进程的线程。
但是,除非锁争用非常罕见,否则没有回退的自旋锁会导致功耗和吞吐量效率非常低。或者,如果您不关心效率但关心绝对延迟,则必须严格控制线程调度(有多少线程共存于同一个 machine/NUMA 节点/...、线程亲和性、线程优先级和实时调度选项等等)。实际上,除非您已经知道问题的答案,否则您不会拥有该控制权,因此建议必须远离仅自旋锁同步。