我继承了一些要维护的C#代码,并且对设计有一些保留,但我不知道是否应该。这是一个控制某些工业过程的C#应用程序。
我们有一个方法DoCertify(),它触发一个工作线程来控制一系列工业过程。在序列的每一步中,它控制一些机器,然后编译一些数据。
在UI线程中,调用方分配表示这些步骤的对象数组,并调用DoCertify(),将数组作为ref变量传递。在执行序列中的每个步骤时,DoCertify()的辅助线程周期性地填充数组关联元素(步骤0、element0、步骤1、元素1等)中的数据,并调用委托(即对UI线程的回调),宣布该步骤已经完成,然后继续下一步。
当调用UI线程中的回调时,它读取并显示刚刚完成的数组元素中的数据。以这种方式,在运行DoCertify()时,可以在显示器上更新它的进度。
这里面没有明确的线程安全,但是代码的作者说它本质上是安全的,因为一旦工作线程写入一个元素并发出它已经完成的信号,它就不会再次写入该元素,因此不会有工作线程和UI线程试图同时访问数组中的相同元素的危险。
这是否提供了足够的线程安全,还是应该在此设计中构建更显式的线程安全?
发布于 2015-11-10 23:07:10
它是线程安全的,但不安全。我的意思是,如果你说的是真的,在被调用者调用回调之前,调用者不会读取任何内容,而调用者在切换到工作人员之后不会修改原始数据,等等--你很好。
但这是不安全的,因为开发人员将来可能很容易地做一些事情,比如尝试在调用之间重用数组、向数组添加值、更改数组,或者以其他方式利用ref,以为他们可以在相同的范围内使用这些值。谁知道呢。
你所描述的设计不能防止任何一端的不当行为。在数组的副本(以及数组元素的副本)上工作的设计是一个更好的选择。
https://stackoverflow.com/questions/33638426
复制相似问题