c++ 无互斥锁的事件通知

jvlzgdj9  于 2023-03-05  发布在  其他
关注(0)|答案(4)|浏览(182)

C++11有std::condition_variable,它的等待函数是

template< class Predicate >
void wait( std::unique_lock<std::mutex>& lock, Predicate pred );

它需要一个互斥锁。
据我所知-它的notify_one可以在没有同步的情况下调用(我知道惯用的方法是使用互斥锁)。
我有一个对象,它已经内部同步了-所以我不需要互斥锁来保护它。一个线程应该等待与该对象相关的某个事件,其他线程会得到通知。
在C++11中如何在没有互斥锁的情况下进行这样的通知?例如,使用condition_variable很容易,但它需要互斥锁。我曾想过使用伪互斥锁类型,但std::互斥锁被钉在了等待接口中。
一个选项是轮询std::atomic_flag + sleep,但我不喜欢睡觉。

kqlmhetl

kqlmhetl1#

使用std::condition_variable_any,您可以使用任何实现BasicLockable概念的类。
我对此有一种不好的感觉,我检查了libc++的std::condition_variable_any的实现,结果发现它使用了一个普通的std::condition_variable和一个std::shared_ptr到一个std::mutex,所以肯定会有一些开销,而不必深入研究。(SO上还有一些其他的帖子讨论了这个问题,尽管我必须首先搜索它)
作为一个问题,我可能会建议重新设计您的案例,以便同步实际上只由保护普通条件变量的互斥锁完成。

f87krz0w

f87krz0w2#

在一些线程模型中(虽然我怀疑在现代的线程模型中),互斥锁是用来保护条件变量本身(而不是你正在同步的对象)免受并发访问的,如果条件变量没有互斥锁的保护,你可能会在条件本身遇到问题。
参见Why do pthreads’ condition variable functions require a mutex?

i86rm4rw

i86rm4rw3#

我有一个对象,它已经在内部同步了--我不需要互斥锁来保护它。一个线程应该等待与该对象相关的事件,其他线程会通知它。
如果不持有互斥锁,等待线程将错过通知,无论使用condition_variable还是condition_variable_any与内部互斥锁。
您需要将至少一位额外信息与条件变量相关联,并且这一位应该受到互斥锁的保护。

5t7ly7z5

5t7ly7z54#

C20提供了std::atomic::wait . https://en.cppreference.com/w/cpp/atomic/atomic/wait
它应该更快,在Linux上,它可以用futex(2)实现,但C
库也可以用互斥锁实现。

相关问题