gpt4 book ai didi

synchronization - 在 D 中跨线程共享屏障

转载 作者:行者123 更新时间:2023-12-04 19:45:36 25 4
gpt4 key购买 nike

我有一段时间试图让 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让它成为线程全局的,虽然它有点像黑客:

__gshared Barrier barrier;

线程生成函数只允许传递标记为 shared 的数据,正如你所发现的。然而,由于 Barrier.wait函数未标记为 shared , 你不能用 shared(Barrier) 来调用它对象,使其几乎无用。作为另一个 hack,您可以在调用 wait 之前先将其强制转换为非共享。 :
(cast()barrier).wait();

关于synchronization - 在 D 中跨线程共享屏障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36230346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com