c++ - 64 位/32 位 IPC 的 POSIX 信号量的替代品?
问题描述
我需要为需要在 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 位变量。
推荐阅读
- asp.net-core - MVC Net Core 3.1:创建和下载 PDF 文件的工具
- node.js - 如何在 nodejs 14.15 中运行 WebAssembly
- java - GSON; 如何处理END_DOCUMENT?
- c# - 如何在引导警报 -bootstrap MVC 中插入换行符
- reactjs - 为什么 ReactDOMServer.renderToString 不返回原始 HTML
- flutter - Flutter - 如何在后台格式化通知的标题和正文?
- android - 如何在android studio中正确调用函数
- flutter - 如何使用universal_io包为http请求添加多个标头[flutter web]
- php - Laravel 8 中为 foreach() 提供的参数无效
- amazon-web-services - 自动配置新的 Kubernetes 节点