3 releases

0.1.2 Nov 21, 2024
0.1.1 Nov 20, 2024
0.1.0 Nov 19, 2024

#411 in Concurrency

Download history 335/week @ 2024-11-15 99/week @ 2024-11-22 3/week @ 2024-11-29 2/week @ 2024-12-06

439 downloads per month

MIT/Apache

15KB
194 lines

batch-lock

Rust Crates.io Version codecov

A thread-safe, key-based lock management system for Rust that provides fine-grained concurrent access control.

Features

  • 🔒 Thread-safe key-based locking mechanism
  • 🚀 High-performance concurrent implementation using dashmap
  • 📦 Support for both single-key and batch locking operations
  • 🛡️ RAII-style lock guards for automatic lock release
  • ⚡ Zero-cost abstractions with minimal overhead
  • 🔧 Configurable capacity and sharding for optimal performance

Installation

Add this to your Cargo.toml:

[dependencies]
lock_manager = "0.1"

Usage

Single Key Locking

use batch_lock::LockManager;

// Create a new lock manager
let lock_manager = LockManager::<String>::new();

// Acquire a lock
let guard = lock_manager.lock("resource_1".to_string());

// Critical section - exclusive access guaranteed
// perform operations...

// Lock is automatically released when guard is dropped

Batch Locking

use batch_lock::LockManager;
use std::collections::BTreeSet;

// Create a new lock manager with custom capacity
let lock_manager = LockManager::<String>::with_capacity(1000);

// Prepare multiple keys
let mut keys = BTreeSet::new();
keys.insert("resource_1".to_string());
keys.insert("resource_2".to_string());

// Acquire locks for all keys atomically
let guard = lock_manager.batch_lock(keys);

// Critical section - exclusive access to all keys guaranteed
// perform operations...

// All locks are automatically released when guard is dropped

Custom Capacity and Sharding

use batch_lock::LockManager;

// Create a lock manager with custom capacity and shard count
let lock_manager = LockManager::<String>::with_capacity_and_shard_amount(
    1000,  // capacity
    16     // number of shards
);

Performance Considerations

  • Uses dashmap for efficient concurrent access
  • Lock acquisition is fair and FIFO-ordered
  • Batch locks are acquired in a consistent order to prevent deadlocks
  • Memory usage scales with the number of active locks
  • Sharding can be tuned for optimal performance based on workload

Thread Safety

The LockManager is fully thread-safe and can be safely shared across threads:

use std::sync::Arc;
use batch_lock::LockManager;

let lock_manager = Arc::new(LockManager::<String>::new());
let lock_manager_clone = lock_manager.clone();

std::thread::spawn(move || {
    let guard = lock_manager_clone.lock("shared_resource".to_string());
    // Critical section
});

API Documentation

For detailed API documentation, please visit docs.rs/batch-lock.

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

This project is licensed under MIT or Apache-2.0.

Dependencies

~1.2–8MB
~66K SLoC