Hi, Thanks for the additional details. I was able to reproduce the bug, and I believe I now see the problem. 'atomic-box-compare-and-swap!' is implemented using 'atomic_compare_exchange_weak' (if available), but neglects to handle the case where 'atomic_compare_exchange_weak' may spuriously fail. In that case, the box is left unchanged, although the observed value was equal to the expected value. What's happening here is that the 'atomic-box-compare-and-swap!' in 'sleep-loop' fails spuriously, leaving the box in state #:accepted although it returns #:accepted as its result. When the main loop discovers this, it changes the state to #:need-to-sleep, although the thread has already ended. To confirm this hypothesis, I added a print statement to the main loop showing the state of the box that it observed during the protocol exchange, and indeed it sees #:accepted the first time it checks, and #:need-to-sleep in all later iterations. I've attached a proposed patch that I hope will fix this problem. If you'd be willing to test it, I'd be grateful, but otherwise I'll try to test it in the next week or so. My access to armv7l boxes is somewhat limited. Thanks for this report. Mark