jde*_*ers 5 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();
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试在main函数中完全定义了屏障,但是dmd抱怨:
static assert "Aliases to mutable thread-local data not allowed."
Run Code Online (Sandbox Code Playgroud)
我也尝试将它作为共享变量传递,我得到了这个:
non-shared method core.sync.barrier.Barrier.wait is not callable using a shared object
Run Code Online (Sandbox Code Playgroud)
全局变量在D中默认是线程局部的。当你barrier在主线程中设置时,你只在主线程中设置它;对于其他线程,barrier将是null.
您可以标记barrier为__gshared使其成为线程全局的,尽管这有点麻烦:
__gshared Barrier barrier;
Run Code Online (Sandbox Code Playgroud)
正如您所发现的,线程生成函数仅允许传递标记为 的数据shared。但是,由于该Barrier.wait函数未标记为shared,因此您无法使用shared(Barrier)对象调用它,这使得它几乎毫无用处。作为另一个黑客,您可以在调用之前先将其转换为非共享wait:
(cast()barrier).wait();
Run Code Online (Sandbox Code Playgroud)