# HG changeset patch # User Shinji KONO # Date 1610434037 -32400 # Node ID aaba40049c280fa39e4e14f57324e96041f08d2f # Parent 2c62859962681ebd35b4912707ac6b109fd2ecda unsafe race condition diff -r 2c6285996268 -r aaba40049c28 src/t16thread/src/main.rs --- a/src/t16thread/src/main.rs Tue Jan 12 14:56:07 2021 +0900 +++ b/src/t16thread/src/main.rs Tue Jan 12 15:47:17 2021 +0900 @@ -29,7 +29,8 @@ } handle.join().unwrap(); // without this, some data are dropped // main1(); - t16thread::mpsc_test::mainm(); - t16thread::mpsc_test::mainc(); - t16thread::racecondition::mainr(); + // t16thread::mpsc_test::mainm(); + // t16thread::mpsc_test::mainc(); + // t16thread::racecondition::mainr(); + t16thread::racecondition::mainu(); } \ No newline at end of file diff -r 2c6285996268 -r aaba40049c28 src/t16thread/src/racecondition.rs --- a/src/t16thread/src/racecondition.rs Tue Jan 12 14:56:07 2021 +0900 +++ b/src/t16thread/src/racecondition.rs Tue Jan 12 15:47:17 2021 +0900 @@ -1,6 +1,8 @@ // #![deny(missing_docs)] use std::sync::{Arc, Mutex}; use std::thread; +use std::borrow::BorrowMut; + pub fn mainr() { let counter = Arc::new(Mutex::new(0)); @@ -10,7 +12,6 @@ let counter = Arc::clone(&counter); let handle = thread::spawn(move || { let mut num = counter.lock().unwrap(); - *num += 1; }); handles.push(handle); @@ -22,3 +23,35 @@ println!("Result: {}", *counter.lock().unwrap()); } + +struct Data { + d : u32, +} + +impl Data { + fn work(&mut self) { + self.d += 1; + } +} + +static mut d1 : Data = Data { d : 0 }; + +pub fn mainu() { + let mut handles = vec![]; + + for _ in 0..10 { + let handle = thread::spawn(move || { + unsafe { + d1.work(); + } + }); + handles.push(handle); + } + + for handle in handles { + handle.join().unwrap(); + } + unsafe { + println!("Result: {} ", d1.d); + } +}