首页 > 解决方案 > 64 位/32 位 IPC 的 POSIX 信号量的替代品?

问题描述

我需要为需要在 64 位和 32 位进程之间同步的项目实施某种阻塞等待。忙于等待共享内存变量会引入性能/调度问题,并且 POSIX 信号量似乎不支持 32 位和 64 位进程之间的 IPC。Linux 上的进程间同步还有其他低开销的替代方案吗?

标签: c++clinuxipcsemaphore

解决方案


Linux 有futexes,它是一种内核原语,它为一个进程进入睡眠状态和另一个进程唤醒它提供了一种方式。它们具有非常好的快速路径(在这些情况下避免内核调用),如果将它们用作互斥体,这很重要,但如果将它们用作信号量,则没有那么重要。

您只需要它的两个最原始的功能。一,FUTEX_WAIT,当且仅当共享内存中的特定条目具有特定值时,使内核进入睡眠状态。另一个,FUTEX_WAKE,用 FUTEX_WAIT 唤醒一个已经进入睡眠状态的进程。

您的“等待”代码将自动检查共享变量以查看它是否需要睡眠,然后当且仅当共享变量没有更改时调用 FUTEX_WAIT 进入睡眠状态。您的“唤醒”代码将更改原子共享变量的值,然后调用 FUTEX_WAKE 唤醒任何正在休眠的线程。

如果您使用 64 位共享变量,但仅将有意义的数据放在前 32 位中,那么 32 位/64 位问题根本不重要,因此无论作为 64 位变量还是32 位变量。


推荐阅读