| > is there actually a programming language that makes race conditions impossible To my knowledge, no. > if the existence of races makes a language unsafe, then aren't all languages unsafe? Are we talking about "data races" or "race conditions" One can lead to the other, but race conditions are a much bigger set. AIUI It's impossible for any language level controls to prevent any and all race conditions, because some are happening outside of the binary/process/computer. Data races, OTOH are almost trivial to protect against - a contestable thing must have a guard that ensures a writer has exclusive access to that thing for the duration of the write. Some languages do this with mutually exclusive locks (mutex/semaphore/go channels), some languages/paradigms do this by never having shareable objects (Functional Programming/Pass by Value), and some (Rust) are doing this with the compile time checks and firm rules on a single writer. Edit: Never having shareable objects should really be "never allowing an outside thread/coroutine/process/whatever mutate your copy of an object" meaning that an object is immutable to them, and they have to have a copy that they can mutate to their heart's content. They have to communicate any changes back, and then you choose whether to integrate those changes, or not |