1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
//! Tools for concurrent programming. //! //! ## Atomics //! //! * [`AtomicCell`], a thread-safe mutable memory location. //! * [`AtomicConsume`], for reading from primitive atomic types with "consume" ordering. //! //! ## Data structures //! //! * [`deque`], work-stealing deques for building task schedulers. //! * [`ArrayQueue`], a bounded MPMC queue that allocates a fixed-capacity buffer on construction. //! * [`SegQueue`], an unbounded MPMC queue that allocates small buffers, segments, on demand. //! //! ## Memory management //! //! * [`epoch`], an epoch-based garbage collector. //! //! ## Thread synchronization //! //! * [`channel`], multi-producer multi-consumer channels for message passing. //! * [`Parker`], a thread parking primitive. //! * [`ShardedLock`], a sharded reader-writer lock with fast concurrent reads. //! * [`WaitGroup`], for synchronizing the beginning or end of some computation. //! //! ## Utilities //! //! * [`Backoff`], for exponential backoff in spin loops. //! * [`CachePadded`], for padding and aligning a value to the length of a cache line. //! * [`scope`], for spawning threads that borrow local variables from the stack. //! //! [`AtomicCell`]: atomic/struct.AtomicCell.html //! [`AtomicConsume`]: atomic/trait.AtomicConsume.html //! [`deque`]: deque/index.html //! [`ArrayQueue`]: queue/struct.ArrayQueue.html //! [`SegQueue`]: queue/struct.SegQueue.html //! [`channel`]: channel/index.html //! [`Parker`]: sync/struct.Parker.html //! [`ShardedLock`]: sync/struct.ShardedLock.html //! [`WaitGroup`]: sync/struct.WaitGroup.html //! [`epoch`]: epoch/index.html //! [`Backoff`]: utils/struct.Backoff.html //! [`CachePadded`]: utils/struct.CachePadded.html //! [`scope`]: fn.scope.html #![warn(missing_docs)] #![warn(missing_debug_implementations)] #![cfg_attr(not(feature = "std"), no_std)] #![cfg_attr(feature = "nightly", feature(alloc))] #![cfg_attr(feature = "nightly", feature(cfg_target_has_atomic))] #[macro_use] extern crate cfg_if; #[cfg(feature = "std")] extern crate core; cfg_if! { if #[cfg(feature = "nightly")] { extern crate alloc; } else { mod alloc { extern crate std; pub use self::std::*; } } } mod _epoch { pub extern crate crossbeam_epoch; } #[doc(inline)] pub use _epoch::crossbeam_epoch as epoch; extern crate crossbeam_utils; pub use crossbeam_utils::atomic; /// Miscellaneous utilities. pub mod utils { pub use crossbeam_utils::Backoff; pub use crossbeam_utils::CachePadded; } cfg_if! { if #[cfg(feature = "std")] { mod _deque { pub extern crate crossbeam_deque; } #[doc(inline)] pub use _deque::crossbeam_deque as deque; mod _channel { pub extern crate crossbeam_channel; pub use self::crossbeam_channel::*; } #[doc(inline)] pub use _channel::crossbeam_channel as channel; // HACK(stjepang): This is the only way to reexport `select!` in Rust older than 1.30.0 #[doc(hidden)] pub use _channel::*; mod _queue { pub extern crate crossbeam_queue; } #[doc(inline)] pub use _queue::crossbeam_queue as queue; pub use crossbeam_utils::sync; pub use crossbeam_utils::thread; pub use crossbeam_utils::thread::scope; } }