Skip to content

Commit 6412bf9

Browse files
authored
Rollup merge of #87848 - godmar:@godmar/thread-join-documentation-fix, r=joshtriplett
removed references to parent/child from std::thread documentation - also clarifies how thread.join and detaching of threads works - the previous prose implied that there is a relationship between a spawning thread and the thread being spawned, and that "child" threads couldn't outlive their "parents" unless detached, which is incorrect.
2 parents bcef40e + 2a56a4f commit 6412bf9

File tree

1 file changed

+40
-31
lines changed

1 file changed

+40
-31
lines changed

library/std/src/thread/mod.rs

+40-31
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
//! When the main thread of a Rust program terminates, the entire program shuts
2929
//! down, even if other threads are still running. However, this module provides
3030
//! convenient facilities for automatically waiting for the termination of a
31-
//! child thread (i.e., join).
31+
//! thread (i.e., join).
3232
//!
3333
//! ## Spawning a thread
3434
//!
@@ -42,38 +42,43 @@
4242
//! });
4343
//! ```
4444
//!
45-
//! In this example, the spawned thread is "detached" from the current
46-
//! thread. This means that it can outlive its parent (the thread that spawned
47-
//! it), unless this parent is the main thread.
45+
//! In this example, the spawned thread is "detached," which means that there is
46+
//! no way for the program to learn when the spawned thread completes or otherwise
47+
//! terminates.
4848
//!
49-
//! The parent thread can also wait on the completion of the child
50-
//! thread; a call to [`spawn`] produces a [`JoinHandle`], which provides
51-
//! a `join` method for waiting:
49+
//! To learn when a thread completes, it is necessary to capture the [`JoinHandle`]
50+
//! object that is returned by the call to [`spawn`], which provides
51+
//! a `join` method that allows the caller to wait for the completion of the
52+
//! spawned thread:
5253
//!
5354
//! ```rust
5455
//! use std::thread;
5556
//!
56-
//! let child = thread::spawn(move || {
57+
//! let thread_join_handle = thread::spawn(move || {
5758
//! // some work here
5859
//! });
5960
//! // some work here
60-
//! let res = child.join();
61+
//! let res = thread_join_handle.join();
6162
//! ```
6263
//!
6364
//! The [`join`] method returns a [`thread::Result`] containing [`Ok`] of the final
64-
//! value produced by the child thread, or [`Err`] of the value given to
65-
//! a call to [`panic!`] if the child panicked.
65+
//! value produced by the spawned thread, or [`Err`] of the value given to
66+
//! a call to [`panic!`] if the thread panicked.
67+
//!
68+
//! Note that there is no parent/child relationship between a thread that spawns a
69+
//! new thread and the thread being spawned. In particular, the spawned thread may or
70+
//! may not outlive the spawning thread, unless the spawning thread is the main thread.
6671
//!
6772
//! ## Configuring threads
6873
//!
6974
//! A new thread can be configured before it is spawned via the [`Builder`] type,
70-
//! which currently allows you to set the name and stack size for the child thread:
75+
//! which currently allows you to set the name and stack size for the thread:
7176
//!
7277
//! ```rust
7378
//! # #![allow(unused_must_use)]
7479
//! use std::thread;
7580
//!
76-
//! thread::Builder::new().name("child1".to_string()).spawn(move || {
81+
//! thread::Builder::new().name("thread1".to_string()).spawn(move || {
7782
//! println!("Hello, world!");
7883
//! });
7984
//! ```
@@ -344,7 +349,7 @@ impl Builder {
344349
/// The spawned thread may outlive the caller (unless the caller thread
345350
/// is the main thread; the whole process is terminated when the main
346351
/// thread finishes). The join handle can be used to block on
347-
/// termination of the child thread, including recovering its panics.
352+
/// termination of the spawned thread, including recovering its panics.
348353
///
349354
/// For a more complete documentation see [`thread::spawn`][`spawn`].
350355
///
@@ -389,7 +394,7 @@ impl Builder {
389394
/// The spawned thread may outlive the caller (unless the caller thread
390395
/// is the main thread; the whole process is terminated when the main
391396
/// thread finishes). The join handle can be used to block on
392-
/// termination of the child thread, including recovering its panics.
397+
/// termination of the spawned thread, including recovering its panics.
393398
///
394399
/// This method is identical to [`thread::Builder::spawn`][`Builder::spawn`],
395400
/// except for the relaxed lifetime bounds, which render it unsafe.
@@ -516,15 +521,16 @@ impl Builder {
516521

517522
/// Spawns a new thread, returning a [`JoinHandle`] for it.
518523
///
519-
/// The join handle will implicitly *detach* the child thread upon being
520-
/// dropped. In this case, the child thread may outlive the parent (unless
521-
/// the parent thread is the main thread; the whole process is terminated when
522-
/// the main thread finishes). Additionally, the join handle provides a [`join`]
523-
/// method that can be used to join the child thread. If the child thread
524-
/// panics, [`join`] will return an [`Err`] containing the argument given to
525-
/// [`panic!`].
524+
/// The join handle provides a [`join`] method that can be used to join the spawned
525+
/// thread. If the spawned thread panics, [`join`] will return an [`Err`] containing
526+
/// the argument given to [`panic!`].
527+
///
528+
/// If the join handle is dropped, the spawned thread will implicitly be *detached*.
529+
/// In this case, the spawned thread may no longer be joined.
530+
/// (It is the responsibility of the program to either eventually join threads it
531+
/// creates or detach them; otherwise, a resource leak will result.)
526532
///
527-
/// This will create a thread using default parameters of [`Builder`], if you
533+
/// This call will create a thread using default parameters of [`Builder`], if you
528534
/// want to specify the stack size or the name of the thread, use this API
529535
/// instead.
530536
///
@@ -533,8 +539,8 @@ impl Builder {
533539
///
534540
/// - The `'static` constraint means that the closure and its return value
535541
/// must have a lifetime of the whole program execution. The reason for this
536-
/// is that threads can `detach` and outlive the lifetime they have been
537-
/// created in.
542+
/// is that threads can outlive the lifetime they have been created in.
543+
///
538544
/// Indeed if the thread, and by extension its return value, can outlive their
539545
/// caller, we need to make sure that they will be valid afterwards, and since
540546
/// we *can't* know when it will return we need to have them valid as long as
@@ -1236,10 +1242,10 @@ impl fmt::Debug for Thread {
12361242
#[stable(feature = "rust1", since = "1.0.0")]
12371243
pub type Result<T> = crate::result::Result<T, Box<dyn Any + Send + 'static>>;
12381244

1239-
// This packet is used to communicate the return value between the child thread
1240-
// and the parent thread. Memory is shared through the `Arc` within and there's
1245+
// This packet is used to communicate the return value between the spawned thread
1246+
// and the rest of the program. Memory is shared through the `Arc` within and there's
12411247
// no need for a mutex here because synchronization happens with `join()` (the
1242-
// parent thread never reads this packet until the child has exited).
1248+
// caller will never read this packet until the thread has exited).
12431249
//
12441250
// This packet itself is then stored into a `JoinInner` which in turns is placed
12451251
// in `JoinHandle` and `JoinGuard`. Due to the usage of `UnsafeCell` we need to
@@ -1303,7 +1309,7 @@ impl<T> JoinInner<T> {
13031309
/// }).unwrap();
13041310
/// ```
13051311
///
1306-
/// Child being detached and outliving its parent:
1312+
/// A thread being detached and outliving the thread that spawned it:
13071313
///
13081314
/// ```no_run
13091315
/// use std::thread;
@@ -1361,12 +1367,15 @@ impl<T> JoinHandle<T> {
13611367

13621368
/// Waits for the associated thread to finish.
13631369
///
1370+
/// This function will return immediately if the associated thread has already finished.
1371+
///
13641372
/// In terms of [atomic memory orderings], the completion of the associated
13651373
/// thread synchronizes with this function returning. In other words, all
1366-
/// operations performed by that thread are ordered before all
1374+
/// operations performed by that thread [happen
1375+
/// before](https://doc.rust-lang.org/nomicon/atomics.html#data-accesses) all
13671376
/// operations that happen after `join` returns.
13681377
///
1369-
/// If the child thread panics, [`Err`] is returned with the parameter given
1378+
/// If the associated thread panics, [`Err`] is returned with the parameter given
13701379
/// to [`panic!`].
13711380
///
13721381
/// [`Err`]: crate::result::Result::Err

0 commit comments

Comments
 (0)