繁体   English   中英

C++ 库版本即将推出 C++20 等待/通知

[英]C++ library version of upcoming C++20 wait/notify

C++20 正在引入https://en.cppreference.com/w/cpp/atomic/atomic/waithttps://en.cppreference.com/w/cpp/atomic/atomic/notify_one ,其中引入了原子等待和通知功能。

我想使用它,但我的编译器还不支持它。

  1. 这个功能有可靠的库实现吗?
  2. 我设想在无锁生产者-消费者情况下使用此功能,消费者进入睡眠状态并在有东西消费时被唤醒。 我当前的实现中没有互斥锁。 我是否正确,这样的等待/通知功能将允许我做我想做的事情(即,让我的消费者线程 go 休眠并让生产者在不获取互斥锁的情况下有效地唤醒它(这是必要的,我相信,带有条件变量)。
  3. 实际上,有没有更好的方法来做到这一点,我目前没有想到?

这个功能有可靠的库实现吗?

如果您的编译器的标准库实现还不支持它,您可以使用 Boost.Atomic。

我是否正确,这样的等待/通知功能将允许我做我想做的事情(即,让我的消费者线程 go 休眠并让生产者在不获取互斥锁的情况下有效地唤醒它(这是必要的,我相信,带有条件变量)。

正确的。

实际上,有没有更好的方法来做到这一点,我目前没有想到?

原子等待是一个好方法。 您可能还想以最佳方式使用它:

  • 当您知道对方没有等待时,避免通知。 有些实现会为您检查它,有些则不会。
  • 使用与底层 OS 原语使用相同的原子大小。 这意味着在 Linux 上使用 32 位队列计数器,其中本机原语是futex ,它需要 32 位 integer。 在 Windows 上, WaitOnAddress可以采用 8、16、32 或 64 的任意大小。在其他系统上考虑它们的原子等待实现。

作为其他好方法,您可以考虑使用 C++20 信号量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM