multithreading - 为什么本地创建的结构不能发送到另一个线程?

标签 multithreading concurrency struct d spawn

为什么在 D 中我不能通过 Tid.send 结构的本地实例发送到另一个线程? 我想像这样简单地处理线程通信:

void main()
{
    ...
    tid.send(Command.LOGIN, [ Variant("user"), Variant("hello1234") ] );
    ...
}

void thread()
{
    ...
    receive(
       (Command cmd, Variant[] args) { ... })
    )
    ...
}

如果我理解正确,D 应该在堆栈中创建 Variants 数组,并且 然后复制数组的内容发送函数对吗?所以不应该有任何 关于同步和并发的问题。我很困惑,这种并发是 奇怪,我习惯用 C# 和 C 中的线程进行编码。

此外,我对 shared 关键字和创建共享类感到困惑。 通常当我尝试从非共享对象调用共享类实例的方法时, 编译器抛出错误。为什么?

最佳答案

你应该 idup 数组并且它能够通过,普通数组默认是可共享的(因为它们有一个共享的可变间接寻址)

编译器可以将发送重写为

Variant[] variants = [ Variant("user"), Variant("hello1234") ] ;
tid.send(Command.LOGIN, variants);

并且 Variant[] 未通过 hasUnsharedAlias测试

您可以通过使数组共享或不可变(并在另一侧接收适当的数组)来解决此问题

关于multithreading - 为什么本地创建的结构不能发送到另一个线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22584058/

相关文章:

asp.net后台线程异常处理

perl - worker MPM 下 mod_perl 中的进程内协调

c - Pthreads 在循环完成之前返回,工作似乎在后台继续

java - 可直接访问的数据结构 Java

c - Atom.io 缺少 sys/wait.h 或允许 fork()

c# - 如何确保 T 在固定字节数内是可序列化的?

java - 同步块(synchronized block)和变量作用域

ASP.NET 开发服务器并发处理不起作用

c - C中的struct由1个字段组成,是同一类型的字段吗?

c - 如何将 union 与两个结构一起使用 + 更多