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 在 并发
38KB
553 行
Simple Lock
当前版本:0.4.1
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