gpt4 book ai didi

c++ - Linux/Unix 中的 futex 有什么等价物吗?

转载 作者:IT老高 更新时间:2023-10-28 23:20:58 36 4
gpt4 key购买 nike

我正在寻找可用于 polling 的东西(例如 selectkqueueepoll,即不是忙轮询)在 C/C++ 中。换句话说,我需要阻塞一个线程,然后在另一个线程中以尽可能少的开销唤醒它。

mutex + 条件变量 可以工作,但是开销很大。 futex 也可以,但这仅适用于 Linux(或者可能不是?)。只要 polling 本身正常工作,就不需要额外的同步,例如当我在两个线程中调用 waitwake 时没有比赛。

编辑:如果 FreeBSD 中不存在这样的“工具”,如何使用 C++11 内置类型和系统调用创建一个?

Edit2:由于这个问题已迁移到 SO,我想让它更通用(仅适用于 FreeBSD)

最佳答案

信号量不是互斥体,而且开销会稍微少一些(例如,避免互斥体+condvar 重新锁定)

请注意,由于任何线程休眠直到唤醒的解决方案都将涉及内核系统调用,因此它仍然不便宜。假设 x86_64 glibc 和 FreeBSD libc 都是合理的实现,那么不可避免的成本似乎是:

  1. 计数的用户模式同步(使用 CAS 或类似方法)
  2. 等待队列和线程 sleep /等待的内核管理

我假设您担心的 mutex + condvar 开销是 cond_wait->re-lock->unlock 序列,这里确实避免了。

关于c++ - Linux/Unix 中的 futex 有什么等价物吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23283225/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com