gpt4 book ai didi

c++ - 64 位/32 位 IPC 的 POSIX 信号量的替代方案?

转载 作者:太空狗 更新时间:2023-10-29 12:38:56 33 4
gpt4 key购买 nike

我需要为需要在 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 位变量。

关于c++ - 64 位/32 位 IPC 的 POSIX 信号量的替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57086006/

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