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

MIT/Apache

24KB
481

neocortex

新皮质是一个旨在简单、安全和可扩展的共享内存crate。它通过最小化依赖,将来自libc的不安全共享内存操作封装在一个用户友好的API中。

快速入门

使用目前唯一的内置锁实现进行安装。以下示例提供了更多说明。

cargo add neocortex --features semaphore

系统要求

  • 操作系统:Linux、macOS或其他类UNIX操作系统。
  • 依赖项:用户必须确保系统标准库中提供了libc

安全保证

  • 错误处理:由于libc系统调用本身是不安全的,无法保证在失败时所有分配的资源都被正确清理。此crate提供了两种错误变体,CleanSystemDirtySystem,以指示错误是否留下了悬空资源。所有系统错误也提供了来自操作系统的额外错误信息,作为我们自定义错误消息之上。
  • 错误日志:作为额外的安全保证,所有未正确处理的DirtySystem错误(目前仅在一些Drop实现中)将发出一个tracing::error!事件。

功能

  • 简单API:提供了一个易于使用的共享内存操作接口,抽象了libc的复杂性。
  • 清晰的错误处理:区分了CleanDirty系统错误。
  • 内置同步:包括基于信号量的锁,用于安全的共享内存访问。(需要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