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