在 D 中跨线程共享 Barrier
Share Barrier across threads in D
我正在努力让 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
全局变量在D中默认是线程局部的,当你在主线程中设置barrier
时,你只在主线程中设置;对于其他线程,barrier
将是 null
。
您可以将 barrier
标记为 __gshared
以使其成为线程全局的,尽管这有点 hack:
__gshared Barrier barrier;
如您所见,线程生成函数只允许传递标记为 shared
的数据。但是,由于 Barrier.wait
函数未标记为 shared
,您不能使用 shared(Barrier)
对象调用它,因此它几乎没有用。作为另一种技巧,您可以在调用 wait
:
之前先将其转换为未共享
(cast()barrier).wait();
我正在努力让 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
全局变量在D中默认是线程局部的,当你在主线程中设置barrier
时,你只在主线程中设置;对于其他线程,barrier
将是 null
。
您可以将 barrier
标记为 __gshared
以使其成为线程全局的,尽管这有点 hack:
__gshared Barrier barrier;
如您所见,线程生成函数只允许传递标记为 shared
的数据。但是,由于 Barrier.wait
函数未标记为 shared
,您不能使用 shared(Barrier)
对象调用它,因此它几乎没有用。作为另一种技巧,您可以在调用 wait
:
(cast()barrier).wait();