Project home: https://bues.ch Original repository at: https://git.bues.ch/git/rangelockrs.git

Michael Buesch 06c2ca14ee Fix dead code warning 4 months ago
maintenance cf5f611787 Add README 3 years ago
src 06c2ca14ee Fix dead code warning 4 months ago
tests c04f1188fd tests: Use scoped threads 1 year ago
.gitignore 4594cdd764 Initial commit 3 years ago
Cargo.toml b35faa4f05 Bump version 1 year ago
LICENSE-APACHE 4594cdd764 Initial commit 3 years ago
LICENSE-MIT 4594cdd764 Initial commit 3 years ago
README.rst 95d1426537 Update Readme 1 year ago

README.rst

range-lock - Multithread range lock for Vec
===========================================

`Project home `_

`Git repository `_

`Github repository `_

This crate provides locks/mutexes for multi-threaded access to a single Vec instance.

Any thread can request exclusive access to a slice of the Vec.
Such access is granted, if no other thread is simultaneously holding the permission to access an overlapping slice.


Usage
=====

Add this to your Cargo.toml:

.. code:: toml

[dependencies]
range-lock = "0.2"


VecRangeLock example usage
--------------------------

General purpose VecRangeLock:

.. code:: rust

use range_lock::VecRangeLock;
use std::sync::Arc;
use std::thread;

let lock = Arc::new(VecRangeLock::new(vec![1, 2, 3, 4, 5]));

thread::spawn(move || {
let mut guard = lock.try_lock(2..4).expect("Failed to lock range 2..4");
assert_eq!(guard[0], 3);
guard[0] = 10;
});


RepVecRangeLock example usage
-----------------------------

The RepVecRangeLock is a restricted range lock, that provides access to interleaved patterns of slices to the threads.

Locking a RepVecRangeLock is more lightweight than locking a VecRangeLock.
The threads can not freely choose slice ranges, but only choose a repeating slice pattern by specifying a pattern offset.

Please see the example below.

.. code:: rust

use range_lock::RepVecRangeLock;
use std::sync::Arc;
use std::thread;

let data = vec![1, 2, 3, // <- cycle 0
4, 5, 6]; // <- cycle 1
// ^ ^ ^
// | | |
// | | offset-2
// offset-0 offset-1

let lock = Arc::new(RepVecRangeLock::new(data,
1, // slice_len: Each slice has 1 element.
3)); // cycle_len: Each cycle has 3 slices (offsets).
thread::spawn(move || {
// Lock slice offset 1:
let mut guard = lock.try_lock(1).expect("Failed to lock offset.");

assert_eq!(guard[0][0], 2); // Cycle 0, Slice element 0
assert_eq!(guard[1][0], 5); // Cycle 1, Slice element 0

guard[0][0] = 20; // Cycle 0, Slice element 0
guard[1][0] = 50; // Cycle 1, Slice element 0
});


TODOs for future releases
=========================

The following new features might be candidates for future releases:

* Sleeping lock, in case of lock contention.
* Add support for arrays.


License
=======

Copyright (c) 2021-2023 Michael Büsch

Licensed under the Apache License version 2.0 or the MIT license, at your option.