d的ldc共享问题

原文

void main()
{
    import std.stdio : writeln;
    import core.thread;

    // 用`-O`导致死循环.

    writeln("Starting...");
    bool done = false; // 使它`shared`,但不工作
//用`共享/g共享`没用.
    new Thread({ done = true; }).start();
    while (!done)
    {
    } // Wait for done
    writeln("Done!");
}

不能用volatileLoad,因为文档说,不能用来线程通信.
dmd共享/g共享是工作的.
shared是低级原语,你要用互斥锁/同步语句/std.concurrency.

core.atomic.atomic{Load,Store}可以处理它.

void main()
{
    import std.stdio : writeln;
    import core.thread;
    import core.atomic;

    writeln("Starting...");
    shared bool done = false;//共享.
    new Thread({ atomicStore(done, true); }).start();//加上原子存储
    while (!atomicLoad(done))//原子加载.
    {
    } // 等待完成
    writeln("Done!");
}
posted @ 2022-06-02 09:23  zjh6  阅读(13)  评论(0)    收藏  举报  来源