diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2024-01-15 08:44:48 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-01-15 08:44:48 +0100 |
| commit | 6f2670da7b6923ddcf41df4c4f050aa593b62f18 (patch) | |
| tree | ac76140c93abca1c069ce43e416bb1cc5cdae9c7 | |
| parent | 73256c68b87d3d516514574bb47e724c0c18e6e6 (diff) | |
| parent | a596159dca825a02270335d4b90b8fcb128b2d11 (diff) | |
| download | rust-6f2670da7b6923ddcf41df4c4f050aa593b62f18.tar.gz rust-6f2670da7b6923ddcf41df4c4f050aa593b62f18.zip | |
Rollup merge of #119870 - behnam-oneschema:lazylock-blocking-1, r=tgross35,ChrisDenton
std: Doc blocking behavior of LazyLock Adding notes about blocking behavior of calls that can block the current thread, similar to those on https://doc.rust-lang.org/std/sync/struct.OnceLock.html I'm not sure if the "This method never blocks." counterparts would be desired. If so, can add those, as well.
| -rw-r--r-- | library/std/src/sync/lazy_lock.rs | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/library/std/src/sync/lazy_lock.rs b/library/std/src/sync/lazy_lock.rs index 3598598cfa0..27b59cfc8c2 100644 --- a/library/std/src/sync/lazy_lock.rs +++ b/library/std/src/sync/lazy_lock.rs @@ -20,6 +20,9 @@ union Data<T, F> { /// A value which is initialized on the first access. /// /// This type is a thread-safe [`LazyCell`], and can be used in statics. +/// Since initialization may be called from multiple threads, any +/// dereferencing call will block the calling thread if another +/// initialization routine is currently running. /// /// [`LazyCell`]: crate::cell::LazyCell /// @@ -81,8 +84,7 @@ pub struct LazyLock<T, F = fn() -> T> { } impl<T, F: FnOnce() -> T> LazyLock<T, F> { - /// Creates a new lazy value with the given initializing - /// function. + /// Creates a new lazy value with the given initializing function. #[inline] #[unstable(feature = "lazy_cell", issue = "109736")] pub const fn new(f: F) -> LazyLock<T, F> { @@ -134,9 +136,11 @@ impl<T, F: FnOnce() -> T> LazyLock<T, F> { } } - /// Forces the evaluation of this lazy value and - /// returns a reference to result. This is equivalent - /// to the `Deref` impl, but is explicit. + /// Forces the evaluation of this lazy value and returns a reference to + /// result. This is equivalent to the `Deref` impl, but is explicit. + /// + /// This method will block the calling thread if another initialization + /// routine is currently running. /// /// # Examples /// @@ -204,6 +208,11 @@ impl<T, F> Drop for LazyLock<T, F> { impl<T, F: FnOnce() -> T> Deref for LazyLock<T, F> { type Target = T; + /// Dereferences the value. + /// + /// This method will block the calling thread if another initialization + /// routine is currently running. + /// #[inline] fn deref(&self) -> &T { LazyLock::force(self) @@ -232,7 +241,7 @@ impl<T: fmt::Debug, F> fmt::Debug for LazyLock<T, F> { } // We never create a `&F` from a `&LazyLock<T, F>` so it is fine -// to not impl `Sync` for `F` +// to not impl `Sync` for `F`. #[unstable(feature = "lazy_cell", issue = "109736")] unsafe impl<T: Sync + Send, F: Send> Sync for LazyLock<T, F> {} // auto-derived `Send` impl is OK. |
