spin 0.4.5

Synchronization primitives based on spinning. They may contain data, They are usable without `std` and static initializers are available.

Struct spin::Mutex [] [src]

pub struct Mutex<T: ?Sized> { /* fields omitted */ }

This type provides MUTual EXclusion based on spinning.

Description

This structure behaves a lot like a normal Mutex. There are some differences:

  • It may be used outside the runtime.
    • A normal mutex will fail when used without the runtime, this will just lock
    • When the runtime is present, it will call the deschedule function when appropriate
  • No lock poisoning. When a fail occurs when the lock is held, no guarantees are made

When calling rust functions from bare threads, such as C pthreads, this lock will be very helpful. In other cases however, you are encouraged to use the locks from the standard library.

Simple examples

use spin;
let spin_mutex = spin::Mutex::new(0);

// Modify the data
{
    let mut data = spin_mutex.lock();
    *data = 2;
}

// Read the data
let answer =
{
    let data = spin_mutex.lock();
    *data
};

assert_eq!(answer, 2);

Thread-safety example

use spin;
use std::sync::{Arc, Barrier};

let numthreads = 1000;
let spin_mutex = Arc::new(spin::Mutex::new(0));

// We use a barrier to ensure the readout happens after all writing
let barrier = Arc::new(Barrier::new(numthreads + 1));

for _ in (0..numthreads)
{
    let my_barrier = barrier.clone();
    let my_lock = spin_mutex.clone();
    std::thread::spawn(move||
    {
        let mut guard = my_lock.lock();
        *guard += 1;

        // Release the lock to prevent a deadlock
        drop(guard);
        my_barrier.wait();
    });
}

barrier.wait();

let answer = { *spin_mutex.lock() };
assert_eq!(answer, numthreads);

Methods

impl<T> Mutex<T>
[src]

Creates a new spinlock wrapping the supplied data.

May be used statically:

#![feature(const_fn)]
use spin;

static MUTEX: spin::Mutex<()> = spin::Mutex::new(());

fn demo() {
    let lock = MUTEX.lock();
    // do something with lock
    drop(lock);
}

Consumes this mutex, returning the underlying data.

impl<T: ?Sized> Mutex<T>
[src]

Locks the spinlock and returns a guard.

The returned value may be dereferenced for data access and the lock will be dropped when the guard falls out of scope.

let mylock = spin::Mutex::new(0);
{
    let mut data = mylock.lock();
    // The lock is now locked and the data can be accessed
    *data += 1;
    // The lock is implicitly dropped
}

Force unlock the spinlock.

This is extremely unsafe if the lock is not held by the current thread. However, this can be useful in some instances for exposing the lock to FFI that doesn't know how to deal with RAII.

If the lock isn't held, this is a no-op.

Tries to lock the mutex. If it is already locked, it will return None. Otherwise it returns a guard within Some.

Trait Implementations

impl<T: ?Sized + Send> Sync for Mutex<T>
[src]

impl<T: ?Sized + Send> Send for Mutex<T>
[src]

impl<T: ?Sized + Debug> Debug for Mutex<T>
[src]

Formats the value using the given formatter.

impl<T: ?Sized + Default> Default for Mutex<T>
[src]

Returns the "default value" for a type. Read more