File tree Expand file tree Collapse file tree 3 files changed +41
-0
lines changed
tests/run-pass/concurrency Expand file tree Collapse file tree 3 files changed +41
-0
lines changed Original file line number Diff line number Diff line change 2727//! from acquire/release operations. If weak memory orderings are explored then this
2828//! may need to change or be updated accordingly.
2929//!
30+ //! Per the C++ spec for the memory model a sequentially consistent operation:
31+ //! "A load operation with this memory order performs an acquire operation,
32+ //! a store performs a release operation, and read-modify-write performs
33+ //! both an acquire operation and a release operation, plus a single total
34+ //! order exists in which all threads observe all modifications in the same
35+ //! order (see Sequentially-consistent ordering below) "
36+ //! So in the absence of weak memory effects a seq-cst load & a seq-cst store is identical
37+ //! to a acquire load and a release store given the global sequentially consistent order
38+ //! of the schedule.
39+ //!
3040//! FIXME:
3141//! currently we have our own local copy of the currently active thread index and names, this is due
3242//! in part to the inability to access the current location of threads.active_thread inside the AllocExtra
@@ -196,6 +206,7 @@ struct MemoryCellClocks {
196206
197207 /// The vector-clock of the timestamp of the last read operation
198208 /// performed by a thread since the last write operation occured.
209+ /// It is reset to zero on each write operation.
199210 read : VClock ,
200211
201212 /// Atomic acquire & release sequence tracking clocks.
Original file line number Diff line number Diff line change 1+ // ignore-windows: Concurrency on Windows is not supported yet.
2+ // compile-flags: -Zmiri-disable-data-race-detector
3+
4+ use std:: thread:: spawn;
5+
6+ #[ derive( Copy , Clone ) ]
7+ struct EvilSend < T > ( pub T ) ;
8+
9+ unsafe impl < T > Send for EvilSend < T > { }
10+ unsafe impl < T > Sync for EvilSend < T > { }
11+
12+ pub fn main ( ) {
13+ let mut a = 0u32 ;
14+ let b = & mut a as * mut u32 ;
15+ let c = EvilSend ( b) ;
16+ unsafe {
17+ let j1 = spawn ( move || {
18+ * c. 0 = 32 ;
19+ } ) ;
20+
21+ let j2 = spawn ( move || {
22+ * c. 0 = 64 ; //~ ERROR Data race
23+ } ) ;
24+
25+ j1. join ( ) . unwrap ( ) ;
26+ j2. join ( ) . unwrap ( ) ;
27+ }
28+ }
Original file line number Diff line number Diff line change 1+ warning: thread support is experimental, no weak memory effects are currently emulated.
2+
You can’t perform that action at this time.
0 commit comments