On Monday, 22 October 2018 at 10:26:14 UTC, Timon Gehr wrote:
---
module borked;

void atomicIncrement(int* p)@system{
    import core.atomic;
    atomicOp!("+=",int,int)(*cast(shared(int)*)p,1);
}

struct Atomic(T){
    private T val;
    void opUnary(string op : "++")() shared @trusted {
        atomicIncrement(cast(T*)&val);
    }
}
void main()@safe{
    Atomic!int i;
    auto a=&[i][0];// was: Atomic!int* a = &i;
    import std.concurrency;
    spawn((shared(Atomic!int)* a){ ++*a; }, a);
    ++i.val; // race
}
---


Oh no! The author of the @trusted function (i.e. you) did not deliver on the promise they made!

hi, if you change the private val in Atomic to be “private shared T val”, is the situation the same?

Reply via email to