【问题标题】:Why locally created struct can't be send to another thread?为什么本地创建的结构不能发送到另一个线程?
【发布时间】:2014-03-22 21:50:43
【问题描述】:

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

【问题讨论】:

    标签: multithreading concurrency struct d spawn


    【解决方案1】:

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

    因为是编译器可以将发送重写为

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

    而 Variant[] 未能通过 hasUnsharedAlias 测试

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

    【讨论】:

    • 我尝试了共享,但另一方面我无法调用 get 函数:错误:非共享方法 std.variant.VariantN!(20u).VariantN.get!(Tid)。 get 不能使用共享对象调用如何解决这个问题?还是我应该使用不可变的?
    • true,所以我决定通过创建自己的简化变体来解决它,因为我可以看到,当我想让某些结构共享或不可变时,结构拥有的方法也必须共享或不可变...
    猜你喜欢
    • 2022-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 2014-01-15
    • 1970-01-01
    • 2014-03-20
    • 1970-01-01
    相关资源
    最近更新 更多