Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 线程间传递类型的dlang继承设计_Oop_D - Fatal编程技术网

Oop 线程间传递类型的dlang继承设计

Oop 线程间传递类型的dlang继承设计,oop,d,Oop,D,我正在用D编程语言编写一个多线程程序,但我对该语言还很陌生。使用std.concurrency包中的Tid.send()和receive[Only]()API在线程之间传递的类型有一个限制,即它们必须是值类型,或者必须是常量,以避免发送方和接收方线程之间的争用条件。我有一个简单的struct Message类型,我一直在通过值传递它: enum MessageType { PrepareRequest, PrepareResponse, AcceptRequest,

我正在用D编程语言编写一个多线程程序,但我对该语言还很陌生。使用
std.concurrency
包中的
Tid.send()
receive[Only]()
API在线程之间传递的类型有一个限制,即它们必须是值类型,或者必须是常量,以避免发送方和接收方线程之间的争用条件。我有一个简单的
struct Message
类型,我一直在通过值传递它:

enum MessageType {
    PrepareRequest,
    PrepareResponse,
    AcceptRequest,
    Accepted
}

struct Message {
    MessageType type;
    SysTime timestamp;
    uint node;
    ulong value;
}
然而,一些
MessageType
s没有所有字段,当我可以使用多态性自动完成这项工作时,使用switch语句并记住哪些类型有哪些字段是很烦人的。这里推荐使用
不可变的
类层次结构,还是我已经在使用的方法是最好的方法,为什么

编辑


另外,如果我应该使用不可变类,建议使用什么方法来创建用户定义类的不可变对象?它们来自的类上的静态方法,将返回值强制转换为
immutable

,根据经验法则,如果您有多态类型层次结构,则可以使用类。如果设计上不可能有变异,那么不可变类应该能有效地实现这一点

阿里在DConf2013上的精彩演讲最近已经发表:。它详细介绍了D中
const
immutable
的用法。在它建议使用的其他好东西中
autovar=newimmutable(ClassType)(…)用于创建不可变类的语法。所有的初始化都交给构造函数,不需要特殊的破解。

免费使用共享和锁定,你会没事的…@ratchetfreak我认为使用
shared
或添加锁对于消息对象来说是杀伤力过大的,它们在创建后不会被修改。如果你确定发送者不会改变对象稍后,您可以在发送类时使用
assumeUnique
。您不需要对结构进行任何特殊处理。如果assumeUnique是一个真正的不可变类,并且可以这样创建,则不需要它。@МаааСаСаааа,您是正确的。虽然有时对象最初不是不可变的,或者在发送之前需要进行变异。这就是为什么在这些情况下,我更喜欢使用
assumeUnique
。这对我很有用,谢谢你的链接!我希望这些新的多半径设计模式能更容易被发现。