cached.rs |
|
4451 |
lib.rs |
Per-object thread-local storage
This library provides the `ThreadLocal` type which allows a separate copy of
an object to be used for each thread. This allows for per-object
thread-local storage, unlike the standard library's `thread_local!` macro
which only allows static thread-local storage.
Per-thread objects are not destroyed when a thread exits. Instead, objects
are only destroyed when the `ThreadLocal` containing them is destroyed.
You can also iterate over the thread-local values of all thread in a
`ThreadLocal` object using the `iter_mut` and `into_iter` methods. This can
only be done if you have mutable access to the `ThreadLocal` object, which
guarantees that you are the only thread currently accessing it.
Note that since thread IDs are recycled when a thread exits, it is possible
for one thread to retrieve the object of another thread. Since this can only
occur after a thread has exited this does not lead to any race conditions.
# Examples
Basic usage of `ThreadLocal`:
```rust
use thread_local::ThreadLocal;
let tls: ThreadLocal<u32> = ThreadLocal::new();
assert_eq!(tls.get(), None);
assert_eq!(tls.get_or(|| 5), &5);
assert_eq!(tls.get(), Some(&5));
```
Combining thread-local values into a single result:
```rust
use thread_local::ThreadLocal;
use std::sync::Arc;
use std::cell::Cell;
use std::thread;
let tls = Arc::new(ThreadLocal::new());
// Create a bunch of threads to do stuff
for _ in 0..5 {
let tls2 = tls.clone();
thread::spawn(move || {
// Increment a counter to count some event...
let cell = tls2.get_or(|| Cell::new(0));
cell.set(cell.get() + 1);
}).join().unwrap();
}
// Once all threads are done, collect the counter values and return the
// sum of all thread-local counter values.
let tls = Arc::try_unwrap(tls).unwrap();
let total = tls.into_iter().fold(0, |x, y| x + y.get());
assert_eq!(total, 5);
``` |
21209 |
thread_id.rs |
|
7105 |
unreachable.rs |
|
1747 |