我有一个应用程序,它经常(+-100 in )读取来自PLC的订单,然后将它们放入一个模型中,然后由多个客户端读取。对于此im,使用lock语句。
订单阅读线程:
lock (model) {
//update object
}客户阅读:
lock (model) {
//serialize object to json string
}
send over tcp stream to client.但我也可以用来更新:
Interlocked.ExChange(oldObj, newObj)我不希望我的客户端必须等待发生在Order线程中的锁。我绝对不希望客户阻止我的订单阅读线程。
我还是用联锁好吗?
谢谢你的建议!
发布于 2015-08-20 15:08:36
是的,您最好使用Interlocked,因为它更高效,因为它大多被转换成一个原子操作。
但是,如果您不介意客户机仍然读取旧对象,那么您甚至可以不使用互锁,只需设置一个新实例。
碰巧得到新实例的客户端将获得更新的数据,而那些没有得到更新数据的客户端将在下一次检查中获得数据。
发布于 2015-08-20 15:08:43
如果您的单个生产者正在创建一个全新的模型,并将其分配给一个共享字段,那么是的,Interlocked.Exchange就是这里的方法。
如果您的生产者不需要知道旧模型是什么,那么您可以使用Volatile.Write(ref _sharedObj, newObj)来简化它。
只要注意三件事:
Volatile.Read读取共享对象。obj将过时,var x= CalculateX(obj);var y= CalculateY(obj);https://stackoverflow.com/questions/32121684
复制相似问题