我发现boost和tbb库的条件变量都没有使用读写器锁定的接口(即boost中的共享互斥锁)。 condition_variable :: wait()只接受互斥锁。但我认为让它与读写器锁一起工作是相当合理的。任何人都可以告诉我他们不支持这一点的原因,或者为什么人们不这样做?
谢谢, 崔
答案 0 :(得分:0)
底层平台的本机线程API可能无法轻松支持它。例如,在POSIX平台上,条件变量以pthread_cond_t
实现,它只能与pthread_mutex_t
一起使用。为了获得最大性能,基本条件变量类型是本机类型的轻量级包装器,没有额外的开销。
如果要使用其他类型的互斥锁,则应使用std::condition_variable_any
或boost::condition_variable_any
,它们适用于任何类型的互斥锁。除了用户提供的互斥锁之外,由于使用了原生平台类型的内部互斥锁,因此这会产生很小的额外开销。 (我不知道TBB是否提供了同等类型。)
这是一种设计权衡,允许性能或灵活性。如果您想获得最高性能,可以使用condition_variable
获得,但只能使用简单的互斥锁。如果你想要更灵活,你可以用condition_variable_any
获得,但你必须牺牲一点性能。