在D中的线程之间共享屏障

时间:2016-03-26 00:48:51

标签: synchronization d dmd barrier

我有一段时间试图让D中的屏障同步正常工作。我目前没有得到任何编译器错误,但是每次它到达障碍时我都会遇到分段错误。这基本上就是我所拥有的:

import std.stdio;
import std.conv;
import std.concurrency;
import core.thread;
import core.sync.barrier;

//create barrier
Barrier barrier;

void the_thread()
{
    barrier.wait(); //I get a segmentation fault here
}

void main(string[] args)
{
    int threads = to!int(args[1]); //number of threads

    //init barrier
    barrier = new Barrier(threads);

    //launch threads
    foreach(i; 0 .. threads)
    {
       spawn(&the_thread);
    }
    thread_joinAll();
}

我已尝试在主要功能中完全定义屏障,但dmd抱怨:

static assert  "Aliases to mutable thread-local data not allowed."

我还尝试将其作为共享变量传递,我明白了:

non-shared method core.sync.barrier.Barrier.wait is not callable using a shared object

1 个答案:

答案 0 :(得分:4)

全局变量在D中默认是线程局部的。当你在主线程中设置barrier时,你只在主线程中设置它;对于其他主题,barrier将为null

您可以将barrier标记为__gshared以使其成为线程全局,但它有点像黑客攻击:

__gshared Barrier barrier;

线程生成函数仅允许传递标记为shared的数据,如您所发现的那样。但是,由于Barrier.wait函数未标记为shared,因此您无法使用shared(Barrier)对象调用它,这使得它几乎无用。作为另一个黑客,您可以在调用wait之前将其强制转换为非共享:

(cast()barrier).wait();