用于 64 位/32 位 IPC 的 POSIX 信号量的替代方案?
Alternatives to POSIX semaphores for 64-bit/32-bit IPC?
我需要为需要在 64 位和 32 位进程之间同步的项目实现某种阻塞等待。 忙于等待共享内存变量会带来性能/调度问题,并且 POSIX 信号量似乎不支持 32 位和 64 位进程之间的 IPC。 Linux 上是否有其他低开销的流程间同步替代方案?
Linux 有 futexes,它是一个内核原语,它为一个进程进入睡眠状态和另一个进程唤醒它提供了一种方式。它们具有非常好的快速路径(在这些情况下避免内核调用),如果您将它们用作互斥锁,这很重要,但如果将它们用作信号量,则就不那么重要了。
你只需要它的两个最原始的函数。FUTEX_WAIT,当且仅当共享内存中的特定条目具有特定值时,才会使内核进入睡眠状态。另一个,FUTEX_WAKE,唤醒一个已经进入睡眠状态的进程FUTEX_WAIT。
您的"等待"代码将以原子方式检查共享变量以查看它是否需要休眠,然后在且仅当共享变量未更改时调用FUTEX_WAIT进入睡眠状态。您的"唤醒"代码将更改原子共享变量的值,然后调用FUTEX_WAKE唤醒任何处于休眠状态的线程。
如果您使用 64 位共享变量,但只在前 32 位中放置有意义的数据,则 32 位/64 位问题根本不重要,因此无论作为 64 位变量还是 32 位变量寻址,它的工作原理都相同。
对于使用阻塞等待的进程间同步,简单的解决方案包括命名管道 (fd) 或系统 V 信号量。
命名管道具有与其关联的文件路径,以便两个进程可以独立打开文件(一个用于读取,另一个用于写入)。 对于纯同步,只需putc()
发出信号,getc()
等待,一次一个字符(值无关紧要)。 这将创建一个单向("半双工")通道;对于双向信号/等待,您将创建两个文件。 您甚至可以通过连续执行许多putc()
调用来排队多个信号,有点像永不饱和的信号量。
系统 V 信号量还具有与其关联的文件路径。 它们的行为类似于Dijkstra信号量。
有关其他选项,请查看
https://en.wikipedia.org/wiki/Inter-process_communication
- 删除旧的信号量系统V
- 父进程和子进程之间的 POSIX 信号量
- 访问共享内存而不使用易失性、std::atomic、信号量、互斥锁和自旋锁
- 多线程.如果我使用信号量,我可以在开始时创建很多线程还是应该只有几个线程?
- C/C++ - 用于按顺序打印数字的 sem_t 类型的单个信号量
- 单车道桥 使用信号量进行同步
- 用于 64 位/32 位 IPC 的 POSIX 信号量的替代方案?
- 这个餐饮哲学家问题(dpp)的解决方案是如何工作的?互斥体和信号量
- 发布信号量返回错误 6(无效句柄)
- 在 C Linux 中使用三个线程使用信号量同步按顺序打印 3 4 5 50 次
- 在使用 pthread 和信号量实现生产者-消费者问题时需要帮助
- 如何让一个线程继续,而另一个线程正在等待C++中的信号量
- 实现信号量
- 计算信号量还是互斥体?
- POSIX 信号量在高争用/负载下不起作用
- C++:提升:托管共享内存是否需要信号量锁
- 信号量的问题
- 如何使用Windows API直接将进程"assign"到信号量?
- 从主线程C++更新信号量
- 生产者 - 消费者生产商创建2个元素POSIX信号量