gpt4 book ai didi

multithreading - 不允许使用可变线程本地数据的别名

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

我是 D 新手,正在编写一个简单的多线程服务器以供练习。在 C 中启动客户端处理程序线程的一个常见范例是将新接受 () 的套接字的文件描述符传递到 pthread_create(),但 D 的 std.concurrency.spawn() 不允许我传递套接字,因为它是可变的并且可以通过两个线程访问。

当然,我实际上并不想要一个不可变的套接字(这就是为什么我真的不想将它转换到主线程中,除非我必须这样做) - 我想传递一个可变的套接字并让它超出范围在主线程中。我该怎么办?应该(/可以)我使用 tid.send(s)让线程使用套接字?出于某种原因,这对我来说似乎很笨重。

我现在的代码:

void main() {
Socket listener = new TcpSocket;
...
for (;;) {
Socket s = listener.accept();
scope(exit) s.close();

auto tid = spawn(&clientHandler, s);
}
}

void clientHandler(Socket s) {
...
}

这会产生:错误:静态断言“不允许使用可变线程本地数据的别名”。 ...从这里实例化:spawn!(Socket)

最佳答案

您需要在客户端处理程序中将套接字转换为共享并再次返回

auto tid = spawn(&clientHandler, cast(shared) s);

void clientHandler(shared Socket s) {
Socket sock = cast(Socket)s;
scope(exit)sock.close();
}

这样做的原因是所有局部变量都是隐式线程局部的,除非指定 shared ,并且只有对 shared 或 immutable 的引用才能作为参数传递给 spawn (或 send )而按值传递的东西(没有引用和基元的结构)很好

您还应该像当前实现一样将 close int 放入处理程序中,套接字可能会在新生成的线程有机会运行之前关闭

关于multithreading - 不允许使用可变线程本地数据的别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14395018/

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