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

时间:2014-03-22 21:50:44

标签: 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关键字以及创建共享类感到困惑。 Usualy当我尝试从非共享对象调用共享类实例的方法时, 编译器抛出错误。为什么?

1 个答案:

答案 0 :(得分:3)

你应该对数组进行idup并且它能够通过,普通数组是默认可共享的(因为它们具有共享的可变间接)

编译器可以将发送重写为

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

和Variant []未通过hasUnsharedAlias测试

你可以通过使数组共享或不可变(并在另一端接收适当的数组)来解决这个问题。