Oop 线程间传递类型的dlang继承设计
我正在用D编程语言编写一个多线程程序,但我对该语言还很陌生。使用Oop 线程间传递类型的dlang继承设计,oop,d,Oop,D,我正在用D编程语言编写一个多线程程序,但我对该语言还很陌生。使用std.concurrency包中的Tid.send()和receive[Only]()API在线程之间传递的类型有一个限制,即它们必须是值类型,或者必须是常量,以避免发送方和接收方线程之间的争用条件。我有一个简单的struct Message类型,我一直在通过值传递它: enum MessageType { PrepareRequest, PrepareResponse, AcceptRequest,
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
。这对我很有用,谢谢你的链接!我希望这些新的多半径设计模式能更容易被发现。