这种设计的线程安全性?

时间:2015-11-10 19:56:17

标签: c# thread-safety

我继承了一些C#代码来维护,我对设计有一些保留意见,但我不知道是否应该这样做。这适用于控制某些工业流程的C#应用​​程序。

我们有一个方法 DoCertify(),它会触发一个工作线程来控制一系列工业过程。在序列的每个步骤中,它控制一些机器然后编译一些数据。

调用者在UI线程中分配表示这些步骤的对象数组,并调用 DoCertify()将数组作为 ref 变量传递。 定期完成序列中的每个步骤, DoCertify()的工作线程填充数组关联元素中的数据(步骤0,元素0,步骤1,元素1等),并调用一个委托(即回调到UI线程),宣布该步骤已完成,然后继续下一步。

当调用UI线程中的回调时,它会读取并显示数组中刚刚完成的元素中的数据。通过这种方式,当 DoCertify()运行时,可以在显示屏上更新其进度。

没有明确的线程安全性,但代码的编写者说它本身就是安全的,因为一旦工作线程写入一个元素并发出信号表明它已完成,它就永远不会再写入该元素,所以没有危险工作线程和UI线程试图同时访问数组中的同一元素。

这是否提供了足够的线程安全性,还是应该在此设计中构建更明确的线程安全性?

1 个答案:

答案 0 :(得分:1)

它是线程安全的,但不安全。我的意思是 if 你说的是真的,调用者在被调用者调用回调之前不会读取任何内容,并且调用者在切换到worker之后不会修改原始数据等 - 你没事。

但它不安全,因为开发人员可能会在将来轻松做某事,比如尝试在调用之间重用数组,向数组添加值,更改数据,或以其他方式利用 ref 认为他们可以使用相同范围内的值。谁知道呢。

您描述的设计不能防止两端的错误行为。对数组副本(以及数组元素的副本)起作用的设计是更好的选择。