# Why loom is happy with this?

**URL:** <https://users.rust-lang.org/t/why-loom-is-happy-with-this/143495>\
**Category:** uncategorized\
**Created:** [November 5, 2026, 11:56am UTC](https://users.rust-lang.org/t/why-loom-is-happy-with-this/143495 "2026-11-05T11:56:41Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![okkotsu](https://sea1.discourse-cdn.com/flex019/user_avatar/users.rust-lang.org/okkotsu/32/53930_2.png) [@okkotsu](https://users.rust-lang.org/u/okkotsu)\
**Post date:** [November 5, 2026, 11:56am UTC](https://users.rust-lang.org/t/why-loom-is-happy-with-this/143495/1 "2026-11-05T11:56:41Z")

</div>

```rust
   use loom::sync::Arc;
   use loom::sync::atomic::{AtomicBool, AtomicUsize, Ordering};

   loom::model(|| {
        let ptr = Box::into_raw(Box::new(0));
        let flag = Arc::new(AtomicBool::new(false));
        let flag2 = flag.clone();

        loom::thread::spawn(move || {
            unsafe { *ptr = 1 };
            flag.store(true, Ordering::Relaxed);
        });
        
        loom::thread::spawn(move || {
            if flag2.load(Ordering::Relaxed) {
                assert!(unsafe { *ptr == 1 });
            }
        });
    });

```

this passes, could someone please explain why? thanks!  
edit: oh, UB?

---

<div class="post-metadata">

**Author:** ![robofinch](https://sea1.discourse-cdn.com/flex019/user_avatar/users.rust-lang.org/robofinch/32/49287_2.png) [@robofinch](https://users.rust-lang.org/u/robofinch)\
**Post date:** [November 5, 2026, 12:03pm UTC](https://users.rust-lang.org/t/why-loom-is-happy-with-this/143495/2 "2026-11-05T12:03:51Z")

</div>

Yeah, UB.

How about using: [UnsafeCell in loom::cell - Rust](https://docs.rs/loom/latest/loom/cell/struct.UnsafeCell.html)

Also looks like `MutPtr` would be useful.

---

<div class="post-metadata">

**Author:** ![farnz](https://sea1.discourse-cdn.com/flex019/user_avatar/users.rust-lang.org/farnz/32/14366_2.png) [@farnz](https://users.rust-lang.org/u/farnz)\
**Post date:** [November 5, 2026, 12:15pm UTC](https://users.rust-lang.org/t/why-loom-is-happy-with-this/143495/3 "2026-11-05T12:15:28Z")

</div>

If I rewrite it so that Loom can track the raw pointer use, I get:

```rust
use loom::sync::Arc;
use loom::sync::atomic::{AtomicBool, Ordering};

fn main() {
    loom::model(|| {
        let cell = loom::cell::UnsafeCell::new(0);
        let flag = Arc::new(AtomicBool::new(false));

        loom::thread::spawn({
            let ptr = cell.get_mut();
            let flag = flag.clone();
            move || {
                unsafe { *ptr.deref() = 1 };
                flag.store(true, Ordering::Relaxed);
            }
        });

        loom::thread::spawn({
            let ptr = cell.get_mut();
            let flag = flag.clone();
            move || {
                if flag.load(Ordering::Relaxed) {
                    assert!(unsafe { *ptr.deref() == 1 });
                }
            }
        });
    });
}

```

(which does fail)
