在Linux/Unix中有类似futex的功能吗

Are there any equivalents to the futex in Linux/Unix?

本文关键字:futex 功能 Linux Unix      更新时间:2023-10-16

我正在寻找一些可以用于C/C++中轮询的东西(如selectkqueueepoll,即不忙于轮询

mutex+condition variable可以工作,但会有很多开销。futex也可以,但它只适用于Linux(或者可能不适用?)。只要轮询本身正常工作,就不需要额外的同步,例如,当我在两个线程中调用waitwake时,不需要竞争。

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

第2版:由于这个问题已经迁移到SO,我想让它更通用(不只是针对FreeBSD)

信号量不是互斥体,工作时开销略低(例如,避免互斥体+condvar重锁)

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

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

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

对于到线程之间的信号传递,需要信号量而不是互斥量。。

http://man7.org/linux/man-pages/man3/sem_wait.3.html

信号量可以像计数器一样使用,例如,如果您有一个队列,则每次插入消息时都会增加(post)信号量,而接收器则会为它取出的每一条消息减少(wait)信号量。如果计数器达到零,接收器将阻塞,直到有消息发布。

因此,一种典型的模式是将一个互斥对象和一个类似信号量的对象组合在一起;

sender:
    mutex.lock
    insert message in shared queue
    mutex.unlock
    semaphore.post
receiver:
    semaphore.wait
    mutex.lock
    dequeue message from shared structure
    mutex.unlock