Skip to content

Commit 21429ed

Browse files
committed
Improve std::thread::available_parallelism docs
1 parent 44995f7 commit 21429ed

File tree

1 file changed

+57
-20
lines changed

1 file changed

+57
-20
lines changed

library/std/src/thread/mod.rs

+57-20
Original file line numberDiff line numberDiff line change
@@ -1427,39 +1427,76 @@ fn _assert_sync_and_send() {
14271427
_assert_both::<Thread>();
14281428
}
14291429

1430-
/// Returns the number of hardware threads available to the program.
1431-
///
1432-
/// This value should be considered only a hint.
1433-
///
1434-
/// # Platform-specific behavior
1435-
///
1436-
/// If interpreted as the number of actual hardware threads, it may undercount on
1437-
/// Windows systems with more than 64 hardware threads. If interpreted as the
1438-
/// available concurrency for that process, it may overcount on Windows systems
1439-
/// when limited by a process wide affinity mask or job object limitations, and
1440-
/// it may overcount on Linux systems when limited by a process wide affinity
1441-
/// mask or affected by cgroups limits.
1430+
/// Returns an estimate of the default amount of parallelism a program should use.
1431+
///
1432+
/// Parallelism is a resource. A given machine provides a certain capacity for
1433+
/// parallelism, i.e., a bound on the number of computations it can perform
1434+
/// simultaneously. This number often corresponds to the amount of CPUs or
1435+
/// computer has, but it may diverge in various cases.
1436+
///
1437+
/// Host environments such as VMs or container orchestrators may want to
1438+
/// restrict the amount of parallelism made available to programs in them. This
1439+
/// is often done to limit the potential impact of (unintentionally)
1440+
/// resource-intensive programs on other programs running on the same machine.
1441+
///
1442+
/// # Limitations
1443+
///
1444+
/// The purpose of this API is to provide an easy and portable way to query
1445+
/// the default amount of parallelism the program should use. Among other things it
1446+
/// does not expose information on NUMA regions, does not account for
1447+
/// differences in (co)processor capabilities, and will not modify the program's
1448+
/// global state in order to more accurately query the amount of available
1449+
/// parallelism.
1450+
///
1451+
/// The value returned by this function should be considered a simplified
1452+
/// approximation of the actual amount of parallelism available at any given
1453+
/// time. To get a more detailed or precise overview of the amount of
1454+
/// parallelism available to the program, you may wish to use
1455+
/// platform-specific APIs as well. The following platform limitations currently
1456+
/// apply to `available_parallelism`:
1457+
///
1458+
/// On Windows:
1459+
/// - It may undercount the amount of parallelism available on systems with more
1460+
/// than 64 logical CPUs. However, programs typically need specific support to
1461+
/// take advantage of more than 64 logical CPUs, and in the absence of such
1462+
/// support, the number returned by this function accurately reflects the
1463+
/// number of logical CPUs the program can use by default.
1464+
/// - It may overcount the amount of parallelism available on systems limited by
1465+
/// process-wide affinity masks, or job object limitations.
1466+
///
1467+
/// On Linux:
1468+
/// - It may overcount the amount of parallelism available when limited by a
1469+
/// process-wide affinity mask, or when affected by cgroup limits.
1470+
///
1471+
/// On all targets:
1472+
/// - It may overcount the amount of parallelism available when running in a VM
1473+
/// with CPU usage limits (e.g. an overcommitted host).
14421474
///
14431475
/// # Errors
14441476
///
1445-
/// This function will return an error in the following situations, but is not
1446-
/// limited to just these cases:
1477+
/// This function will, but is not limited to, return errors in the following
1478+
/// cases:
14471479
///
1448-
/// - If the number of hardware threads is not known for the target platform.
1449-
/// - The process lacks permissions to view the number of hardware threads
1450-
/// available.
1480+
/// - If the amount of parallelism is not known for the target platform.
1481+
/// - If the program lacks permission to query the amount of parallelism made
1482+
/// available to it.
14511483
///
14521484
/// # Examples
14531485
///
14541486
/// ```
14551487
/// # #![allow(dead_code)]
14561488
/// #![feature(available_parallelism)]
1457-
/// use std::thread;
1489+
/// use std::{io, thread};
14581490
///
1459-
/// let count = thread::available_parallelism().map(|n| n.get()).unwrap_or(1);
1491+
/// fn main() -> io::Result<()> {
1492+
/// let count = thread::available_parallelism()?.get();
1493+
/// assert!(count >= 1_usize);
1494+
/// Ok(())
1495+
/// }
14601496
/// ```
1497+
#[doc(alias = "available_concurrency")] // Alias for a previous name we gave this API on unstable.
14611498
#[doc(alias = "hardware_concurrency")] // Alias for C++ `std::thread::hardware_concurrency`.
1462-
#[doc(alias = "available_concurrency")] // Alias for a name we gave this API on unstable.
1499+
#[doc(alias = "num_cpus")] // Alias for a popular ecosystem crate which provides similar functionality.
14631500
#[unstable(feature = "available_parallelism", issue = "74479")]
14641501
pub fn available_parallelism() -> io::Result<NonZeroUsize> {
14651502
imp::available_parallelism()

0 commit comments

Comments
 (0)