5 个版本 (3 个重大变更)

0.4.1 2020年11月30日
0.4.0 2020年6月4日
0.3.0 2020年5月30日
0.2.0 2020年5月25日
0.1.0 2020年5月24日

#860并发

MIT 许可证

38KB
553

Simple Lock

当前版本:0.4.1

License builds.sr.ht status Latest version Documentation

Rust 中进程间/线程同步的简单锁抽象。

特性

默认情况下,不会启用任何特性,并且只有 Lock 特性和实用功能将可用。如果您希望手动实现自己的锁,但又不想重写实用函数,这可能很有用。

当前实现

  • fake - 启用 FakeLock 实现(仅对测试有用)。
  • file - 启用 FileLock 实现(最常见且跨平台)。
  • sema - 启用 SemaphoreLock 实现(最小化,仅限 libc/nix)。

示例

基本示例

use simplelock::*;

// Our application's lock namespace. We use this on creation to allow for
// cross-process synchronization. This lets multiple instances of this
// application run at once without conflicting.
const MY_APP_NAME: &str = "my_app_name";

fn main() -> SimpleLockResult<()> {
    // Creates the lock based on the "feature" enabled in Cargo.toml.
    // Will return a SimpleLockError if an error happens when creating
    // the lock with the default configuration, or if no lock type was
    // enabled as a "feature".
    let mut lock = default_lock(MY_APP_NAME)?;

    // One of the utility functions provided, simple critical-section
    // locking. All of the bundled Locks' behaviours, will, by default,
    // hang until the lock is available. This can be customized.
    let result = lock_until_finished(
        &mut lock,
        || {
            /// Some critical code.
        })?;

    // ... Do something with the result.
}

如果您需要更多自定义锁的行为,可以使用 LockBuilder 来覆盖锁定/解锁行为。

use simplelock::*;

fn main() -> SimpleLockResult<()> {
    let mut lock = LockBuilder::default()
                       .with_try_lock()      // Allow immediate return if lock taken.
                       .with_silent_unlock() // Suppress failure to return result.
                       .build(MY_APP_NAME)?;

    // do something with your lock.
}

如果您想实现自己的锁,可以实现 Lock 特性或 ConcreteLock,并使用它与此包提供的所有相同实用功能。如果您没有启用任何特性,此包仅包含特性和实用函数。

注意事项

如果您可以接受以下内容,那么请继续使用此包。

  • unsafe - "semaphore" 锁实现包含不安全代码,这是因为 nix 包尚未提供 POSIX 信号量的实现。如果这不可接受,请勿启用 "semaphore" 特性。
  • no_std - 我们目前没有任何非标准库的锁实现("semaphore" 接近)。一些实用功能使用 std,但在 v1.0 之前需要进行一些重工作。

贡献

请参阅 doc/CONTRIBUTING.md

常见问题解答 (FAQ)

请参阅 doc/FAQ.md

依赖项

~0.3–1.6MB
~33K SLoC