diff options
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/Cargo.toml | 2 | ||||
| -rw-r--r-- | src/libstd/sync/mpsc/mod.rs | 35 | ||||
| -rw-r--r-- | src/libstd/thread/mod.rs | 31 |
3 files changed, 50 insertions, 18 deletions
diff --git a/src/libstd/Cargo.toml b/src/libstd/Cargo.toml index 717892be2ab..e17918506fe 100644 --- a/src/libstd/Cargo.toml +++ b/src/libstd/Cargo.toml @@ -35,7 +35,7 @@ rustc_tsan = { path = "../librustc_tsan" } [build-dependencies] build_helper = { path = "../build_helper" } -gcc = "0.3.27" +gcc = "0.3.50" [features] backtrace = [] diff --git a/src/libstd/sync/mpsc/mod.rs b/src/libstd/sync/mpsc/mod.rs index 40b3e789ce4..7d5e1929cd2 100644 --- a/src/libstd/sync/mpsc/mod.rs +++ b/src/libstd/sync/mpsc/mod.rs @@ -1370,14 +1370,16 @@ impl<T> Receiver<T> { /// let (send, recv) = channel(); /// /// thread::spawn(move || { - /// send.send(1u8).unwrap(); - /// send.send(2u8).unwrap(); - /// send.send(3u8).unwrap(); + /// send.send(1).unwrap(); + /// send.send(2).unwrap(); + /// send.send(3).unwrap(); /// }); /// - /// for x in recv.iter() { - /// println!("Got: {}", x); - /// } + /// let mut iter = recv.iter(); + /// assert_eq!(iter.next(), Some(1)); + /// assert_eq!(iter.next(), Some(2)); + /// assert_eq!(iter.next(), Some(3)); + /// assert_eq!(iter.next(), None); /// ``` #[stable(feature = "rust1", since = "1.0.0")] pub fn iter(&self) -> Iter<T> { @@ -1393,29 +1395,34 @@ impl<T> Receiver<T> { /// /// # Examples /// - /// ```rust + /// ```no_run /// use std::sync::mpsc::channel; /// use std::thread; /// use std::time::Duration; /// /// let (sender, receiver) = channel(); /// - /// // Nothing is in the buffer yet + /// // nothing is in the buffer yet /// assert!(receiver.try_iter().next().is_none()); - /// println!("Nothing in the buffer..."); /// /// thread::spawn(move || { + /// thread::sleep(Duration::from_secs(1)); /// sender.send(1).unwrap(); /// sender.send(2).unwrap(); /// sender.send(3).unwrap(); /// }); /// - /// println!("Going to sleep..."); - /// thread::sleep(Duration::from_secs(2)); // block for two seconds + /// // nothing is in the buffer yet + /// assert!(receiver.try_iter().next().is_none()); + /// + /// // block for two seconds + /// thread::sleep(Duration::from_secs(2)); /// - /// for x in receiver.try_iter() { - /// println!("Got: {}", x); - /// } + /// let mut iter = receiver.try_iter(); + /// assert_eq!(iter.next(), Some(1)); + /// assert_eq!(iter.next(), Some(2)); + /// assert_eq!(iter.next(), Some(3)); + /// assert_eq!(iter.next(), None); /// ``` #[stable(feature = "receiver_try_iter", since = "1.15.0")] pub fn try_iter(&self) -> TryIter<T> { diff --git a/src/libstd/thread/mod.rs b/src/libstd/thread/mod.rs index d0e3b00d75f..64c31c2a681 100644 --- a/src/libstd/thread/mod.rs +++ b/src/libstd/thread/mod.rs @@ -1094,11 +1094,12 @@ impl<T> JoinInner<T> { /// An owned permission to join on a thread (block on its termination). /// -/// A `JoinHandle` *detaches* the child thread when it is dropped. +/// A `JoinHandle` *detaches* the associated thread when it is dropped, which +/// means that there is no longer any handle to thread and no way to `join` +/// on it. /// /// Due to platform restrictions, it is not possible to [`Clone`] this -/// handle: the ability to join a child thread is a uniquely-owned -/// permission. +/// handle: the ability to join a thread is a uniquely-owned permission. /// /// This `struct` is created by the [`thread::spawn`] function and the /// [`thread::Builder::spawn`] method. @@ -1127,6 +1128,30 @@ impl<T> JoinInner<T> { /// }).unwrap(); /// ``` /// +/// Child being detached and outliving its parent: +/// +/// ```no_run +/// use std::thread; +/// use std::time::Duration; +/// +/// let original_thread = thread::spawn(|| { +/// let _detached_thread = thread::spawn(|| { +/// // Here we sleep to make sure that the first thread returns before. +/// thread::sleep(Duration::from_millis(10)); +/// // This will be called, even though the JoinHandle is dropped. +/// println!("♫ Still alive ♫"); +/// }); +/// }); +/// +/// let _ = original_thread.join(); +/// println!("Original thread is joined."); +/// +/// // We make sure that the new thread has time to run, before the main +/// // thread returns. +/// +/// thread::sleep(Duration::from_millis(1000)); +/// ``` +/// /// [`Clone`]: ../../std/clone/trait.Clone.html /// [`thread::spawn`]: fn.spawn.html /// [`thread::Builder::spawn`]: struct.Builder.html#method.spawn |
