The variable to initialize
The lazy initializer value
A mutex to prevent race conditions
A reference to the initialized variable
Use a separate mutex when init blocks on another thread that might also call initOnce.
import core.sync.mutex : Mutex; static shared bool varA, varB; static shared Mutex m; m = new shared Mutex; spawn({ // use a different mutex for varB to avoid a dead-lock initOnce!varB(true, m); ownerTid.send(true); }); // init depends on the result of the spawned thread initOnce!varA(receiveOnly!bool); assert(varA == true); assert(varB == true);
Same as above, but takes a separate mutex instead of sharing one among all initOnce instances.
This should be used to avoid dead-locks when the init expression waits for the result of another thread that might also call initOnce. Use with care.