16个版本 (10个稳定版本)
| 3.0.3 | 2024年5月29日 |
|---|---|
| 3.0.2 | 2024年5月27日 |
| 2.0.0 | 2024年4月12日 |
| 1.2.1 | 2024年4月8日 |
| 0.1.5 | 2024年4月1日 |
#175 in Unix API
24KB
481 行
neocortex

新皮质是一个旨在简单、安全和可扩展的共享内存crate。它通过最小化依赖,将来自libc的不安全共享内存操作封装在一个用户友好的API中。
快速入门
使用目前唯一的内置锁实现进行安装。以下示例提供了更多说明。
cargo add neocortex --features semaphore
系统要求
- 操作系统:Linux、macOS或其他类UNIX操作系统。
- 依赖项:用户必须确保系统标准库中提供了
libc。
安全保证
- 错误处理:由于
libc系统调用本身是不安全的,无法保证在失败时所有分配的资源都被正确清理。此crate提供了两种错误变体,CleanSystem和DirtySystem,以指示错误是否留下了悬空资源。所有系统错误也提供了来自操作系统的额外错误信息,作为我们自定义错误消息之上。 - 错误日志:作为额外的安全保证,所有未正确处理的
DirtySystem错误(目前仅在一些Drop实现中)将发出一个tracing::error!事件。
功能
- 简单API:提供了一个易于使用的共享内存操作接口,抽象了
libc的复杂性。 - 清晰的错误处理:区分了
Clean和Dirty系统错误。 - 内置同步:包括基于信号量的锁,用于安全的共享内存访问。(需要crate功能"semaphore")。
- 可扩展:通过
CortexSync特性实现自定义同步逻辑的灵活性。
示例
使用内置的信号量锁的简单示例
use neocortex::{Cortex, CortexBuilder, Semaphore};
// Initialize a segment of shared memory with the value 42.0
let key = 123;
let cortex = CortexBuilder::new(42.0)
.key(key)
.with_default_lock::<Semaphore>()
.unwrap();
// Attaching to an existing segment of shared memory requires explicit type annotations
let attached: Cortex<f64, Semaphore> = Cortex::attach(key).unwrap();
assert_eq!(cortex.read().unwrap(), attached.read().unwrap());
// Write to shared memory
let new_val = 12.34;
cortex.write(new_val).unwrap();
assert_eq!(cortex.read().unwrap(), new_val);
semaphore 模块自带一些预定义的权限,这些权限决定了哪些操作系统用户可以与信号量交互。使用 with_default_lock 默认为 OwnerOnly,这是最限制性的模式。查看 SemaphorePermission 了解其他模式,或者使用 Custom 枚举变体来自定义权限。
use neocortex::{CortexBuilder, Semaphore, SemaphoreSettings, SemaphorePermission};
let settings = SemaphoreSettings {
mode: SemaphorePermission::OwnerAndGroup,
};
let cortex = CortexBuilder::new(42.0)
.key(123)
.with_lock::<Semaphore>(&settings)
.unwrap();
其他特性
生成密钥
要生成随机密钥,而不是将 .key(some_key) 传递给构建器,请使用 .random_key()。这将尝试随机化密钥,并在密钥已存在的情况下重试最多 20 次。
强制所有者
在指定密钥后 (随机密钥不适用) 调用构建器的 .force_ownership()。这将创建一个新段或附加到现有的段(如果密钥已存在)。无论如何,这都会通过将所有权设置为 true 来确保在实例被丢弃时清理共享内存。请谨慎使用此功能,因为它如果使用不当可能会删除应用程序其他部分正在使用的内存。
依赖项
~0.3–7.5MB
~42K SLoC