digitalmars.D.learn - unsynchronized access to primitive variables
- luka8088 (15/15) May 19 2012 Hello to all,
- Dejan Lekic (4/19) May 20 2012 This proggy will always print "1" because writeln() prints the
- David Nadlinger (6/9) May 20 2012 This is wrong. _Global_ (or static) variables are in TLS by
- Steven Schveighoffer (8/23) May 23 2012 It depends on hardware architecture. loads and stores of word sizes are...
Hello to all, I would like to know if D guarantees that access to primitive variable is atomic ? I was looking for any source of information that says anything about unsynchronized access to primitive variables. What I want to know is if it is possible (in any way and any OS / hardware) for the following code to output anything other then 1 or 2: import std.stdio; import core.thread; void main () { int value = 1; (new Thread({ value = 2; })).start(); writeln(value); } Thanks !
May 19 2012
On Saturday, 19 May 2012 at 08:16:39 UTC, luka8088 wrote:Hello to all, I would like to know if D guarantees that access to primitive variable is atomic ? I was looking for any source of information that says anything about unsynchronized access to primitive variables. What I want to know is if it is possible (in any way and any OS / hardware) for the following code to output anything other then 1 or 2: import std.stdio; import core.thread; void main () { int value = 1; (new Thread({ value = 2; })).start(); writeln(value); } Thanks !This proggy will always print "1" because writeln() prints the value from the main thread. Spawned thread will have own value. Remember TLS is the default storage.
May 20 2012
On Sunday, 20 May 2012 at 13:51:45 UTC, Dejan Lekic wrote:This proggy will always print "1" because writeln() prints the value from the main thread. Spawned thread will have own value. Remember TLS is the default storage.This is wrong. _Global_ (or static) variables are in TLS by default, but local variables aren't automagically »thread local« in any sense – the fact that value is implicitly heap-allocated due to the closure does not change that. David
May 20 2012
On Sat, 19 May 2012 04:16:39 -0400, luka8088 <luka8088 owave.net> wrote:Hello to all, I would like to know if D guarantees that access to primitive variable is atomic ? I was looking for any source of information that says anything about unsynchronized access to primitive variables. What I want to know is if it is possible (in any way and any OS / hardware) for the following code to output anything other then 1 or 2: import std.stdio; import core.thread; void main () { int value = 1; (new Thread({ value = 2; })).start(); writeln(value); } Thanks !It depends on hardware architecture. loads and stores of word sizes are generally atomic. A better (more portable) version would be to make value size_t or ptrdiff_t, which should mimic CPU word size. In very crude multithreading apps, I rely on this all the time. But you have to be careful not to change the value in more than one thread, or you are subject to racing. -Steve
May 23 2012