我需要检查 Parallel.ForEach
的任何迭代是否达到特定点。根据我的理解,如果我的 bool
是一个 volatile
字段,那么以下内容是安全的,但它需要是封闭方法中的一个变量:
bool anySuccess = false;
Parallel.ForEach(things, thing =>
{
// stuff happens...
anySuccess = true;
});
if(!anySuccess)
throw new Exception("No things succeeded :(");
我可以按原样使用此代码还是应该使用 lock
或 Interlocked
函数?
最佳答案
如果该代码是循环访问该 bool 值的 ENTIRETY,那么是的,这对我来说似乎是安全的。
一般基本值类型不是线程安全的,因为对它们执行的许多操作都不是原子的。
但是,如果您所做的唯一事情就是给那个变量赋值……从不读取它,从不根据它更改分支,从不根据它的当前状态写入它…… . 并且所有写入都是相同的(唯一可能发生的修改是将其设置为 true
)然后我看不到非原子性会导致问题的任何方式。
==添加==
以上对当前代码正确性的评论。作为代码库的一部分,还值得考虑代码在其上下文中的长期安全性。保留该代码原样,是为不知道/理解/识别正在发生的事情以及为什么它目前是安全的 future 开发人员设置陷阱。
如果你这样保留它,则必须对声明和单一用法进行明确的注释,解释发生了什么、为什么它是安全的,以及为什么他们不能开始读取/使用其他变量方式。
备选方案(添加锁定代码)从长远来看更安全,但性能也可能略有下降。
关于c# - 从多个线程写入 bool 变量在 C# 中安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39788625/