9 个版本 (破坏性更新)

使用旧的 Rust 2015

0.7.0 2018 年 12 月 30 日
0.6.0 2018 年 4 月 10 日
0.5.1 2017 年 11 月 3 日
0.5.0 2016 年 8 月 6 日
0.2.1 2015 年 6 月 23 日

1144并发 中排名

Download history 40/week @ 2024-03-30 8/week @ 2024-04-06

每月 54 次下载
xan 中使用

GPL-2.0+

28KB
323 代码行

namedlock

文档


lib.rs:

命名锁的命名空间。

当您需要在运行时只知道资源名称时同步对命名资源的访问时,这很有用。

例如,您可以使用此功能来同步对文件系统的访问

use std::thread;
use std::env;
use std::fs::{OpenOptions,File};
use std::path::PathBuf;
use std::ffi::OsString;
use std::io::{Read,Seek,Write,SeekFrom};
use std::str::FromStr;
use std::sync::Arc;
use namedlock::{LockSpace,AutoCleanup};

// Short-hand function for space.with_lock that opens the file if necessary
fn with_file<R,F>(space:LockSpace<OsString,File>,filename:Arc<PathBuf>,f: F) -> R
	where F: FnOnce(&mut File) -> R
{
	space.with_lock(filename.as_os_str().to_owned(),
		||OpenOptions::new().read(true).write(true).open(&*filename).unwrap(),f
	).unwrap()
}

// Initialize the file
let mut filename=env::temp_dir();
filename.push("namedlock-test");
let filename=Arc::new(filename);
File::create(&*filename).unwrap().write_all(b"0").unwrap();

let space=LockSpace::<OsString,File>::new(AutoCleanup);
let mut threads=vec![];

// Have 10 threads increment the value in the file, one at a time
for i in 0..10 {
	let space_clone=space.clone();
	let filename_clone=filename.clone();
	threads.push(thread::Builder::new().name(format!("{}",i))
		.spawn(move||with_file(space_clone,filename_clone,|file| {
			let mut buf=String::new();
			file.seek(SeekFrom::Start(0)).unwrap();
			file.read_to_string(&mut buf).unwrap();
			file.seek(SeekFrom::Start(0)).unwrap();
			write!(file,"{}",usize::from_str(&buf).unwrap()+1).unwrap();
		})).unwrap()
	);
}

// Wait until all threads are done
let count=threads.len();
for t in threads.into_iter() {
	t.join().unwrap();
}

// Check the result
with_file(space,filename,|file| {
	let mut buf=String::new();
	file.seek(SeekFrom::Start(0)).unwrap();
	file.read_to_string(&mut buf).unwrap();
	assert_eq!(count,usize::from_str(&buf).unwrap());
});

许可证

namedlock - 版权 (C) 2015 Jethro G. Beekman

本程序是免费软件;您可以在自由软件基金会发布的 GNU 通用公共许可证的条款和条件下重新分发和/或修改它;许可证的第二版,或者(根据您的选择)任何较新版本。

本程序的分发是希望它会有用,但没有任何保证;甚至没有关于适销性或特定用途的隐含保证。有关详细信息,请参阅 GNU 通用公共许可证。

您应该已随本程序收到一份 GNU 通用公共许可证副本;如果没有,请写信给自由软件基金会,Inc.,51 Franklin Street,第五层,波士顿,MA 02110-1301,USA。

依赖关系

~0–3MB
~52K SLoC