about summary refs log tree commit diff
path: root/src/libstd/thread
diff options
context:
space:
mode:
authorbenaryorg <binary@benary.org>2019-03-03 15:21:52 +0100
committerbenaryorg <binary@benary.org>2019-03-03 20:53:50 +0100
commit2293d2260a382146fe5ea62ce91580ad7a31178d (patch)
tree2b8e0151321cc14443046e40859cdeaa93de03ac /src/libstd/thread
parentf565cdd6144a72dc81032081d7790f38a4af26b8 (diff)
downloadrust-2293d2260a382146fe5ea62ce91580ad7a31178d.tar.gz
rust-2293d2260a382146fe5ea62ce91580ad7a31178d.zip
race condition in thread local storage example
The example had a potential race condition that would still pass the test.
If the thread which was supposed to modify it's own thread local was slower than the instruction to
modify in the main thread, then the test would pass even in case of a failure.
This is would be minor if the child thread was waited for since it check using an `assert_eq` for
the same thing, but vice versa.
However, if the `assert_eq` failed this would trigger a panic, which is not at all caught by the
example since the thread is not waited on.

Signed-off-by: benaryorg <binary@benary.org>
Diffstat (limited to 'src/libstd/thread')
-rw-r--r--src/libstd/thread/local.rs5
1 files changed, 4 insertions, 1 deletions
diff --git a/src/libstd/thread/local.rs b/src/libstd/thread/local.rs
index 3a876e05ecc..7ad6b124e3a 100644
--- a/src/libstd/thread/local.rs
+++ b/src/libstd/thread/local.rs
@@ -40,13 +40,16 @@ use crate::mem;
 /// });
 ///
 /// // each thread starts out with the initial value of 1
-/// thread::spawn(move|| {
+/// let t = thread::spawn(move|| {
 ///     FOO.with(|f| {
 ///         assert_eq!(*f.borrow(), 1);
 ///         *f.borrow_mut() = 3;
 ///     });
 /// });
 ///
+/// // wait for the thread to complete and bail out on panic
+/// t.join().unwrap();
+///
 /// // we retain our original value of 2 despite the child thread
 /// FOO.with(|f| {
 ///     assert_eq!(*f.borrow(), 2);