On 08/12/2016 09:41 PM, ag0aep6g wrote:
So, `shared int x; x = x + 1;` is ok, as far as I see now. But with
other types, unsafe reads/writes are generated.

Missing alignment can also throw the compiler off:

----
alias T = int;

enum T a = 0x01_01_01_01;
enum T b = 0x02_02_02_02;

struct S
{
    byte[13] padding;
    align(1) T x = a;
}

shared S s;

import core.thread: Thread;

void write()
{
    bool flip = false;
    foreach (i; 0 .. 1_000_000)
    {
        if (flip) s.x = a; else s.x = b;
        flip = !flip;
    }
}

void main()
{
    auto t = new Thread(&write);
    t.start();
    foreach (i; 0 .. 1_000_000)
    {
        T r = s.x;
        assert(r == a || r == b); // fails
    }
    t.join();
}
----

Reply via email to