Struct concread::cowcell::CowCell

source ·
pub struct CowCell<T> { /* private fields */ }
Expand description

A conncurrently readable cell.

This structure behaves in a similar manner to a RwLock<T>. However unlike a RwLock, writes and parallel reads can be performed at the same time. This means readers and writers do no block either other. Writers are serialised.

To achieve this a form of “copy-on-write” (or for Rust, clone on write) is used. As a write transaction begins, we clone the existing data to a new location that is capable of being mutated.

Readers are guaranteed that the content of the CowCell will live as long as the read transaction is open, and will be consistent for the duration of the transaction. There can be an “unlimited” number of readers in parallel accessing different generations of data of the CowCell.

Writers are serialised and are guaranteed they have exclusive write access to the structure.

Examples

use concread::cowcell::CowCell;

let data: i64 = 0;
let cowcell = CowCell::new(data);

// Begin a read transaction
let read_txn = cowcell.read();
assert_eq!(*read_txn, 0);
{
    // Now create a write, and commit it.
    let mut write_txn = cowcell.write();
    *write_txn = 1;
    // Commit the change
    write_txn.commit();
}
// Show the previous generation still reads '0'
assert_eq!(*read_txn, 0);
let new_read_txn = cowcell.read();
// And a new read transaction has '1'
assert_eq!(*new_read_txn, 1);

Implementations

Create a new CowCell for storing type T. T must implement Clone to enable clone-on-write.

Begin a read transaction, returning a read guard. The content of the read guard is guaranteed to be consistent for the life time of the read - even if writers commit during.

Begin a write transaction, returning a write guard. The content of the write is only visible to this thread, and is not visible to any reader until commit() is called.

Attempt to create a write transaction. If it fails, and err is returned. On success the Ok(guard) is returned. See also write(&self)

Trait Implementations

Formats the value using the given formatter. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more
Immutably borrows from an owned value. Read more
Mutably borrows from an owned value. Read more

Returns the argument unchanged.

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

The type returned in the event of a conversion error.
Performs the conversion.
The type returned in the event of a conversion error.
Performs the conversion.