c# - 从多个线程写入 bool 变量在 C# 中安全吗?

标签 c# multithreading task-parallel-library

我需要检查 Parallel.ForEach 的任何迭代是否达到特定点。根据我的理解,如果我的 bool 是一个 volatile 字段,那么以下内容是安全的,但它需要是封闭方法中的一个变量:

bool anySuccess = false;
Parallel.ForEach(things, thing =>
{
    // stuff happens...
    anySuccess = true;
});
if(!anySuccess)
    throw new Exception("No things succeeded :(");

我可以按原样使用此代码还是应该使用 lockInterlocked 函数?

最佳答案

如果该代码是循环访问该 bool 值的 ENTIRETY,那么是的,这对我来说似乎是安全的。

一般基本值类型不是线程安全的,因为对它们执行的许多操作都不是原子的。

但是,如果您所做的唯一事情就是给那个变量赋值……从不读取它,从不根据它更改分支,从不根据它的当前状态写入它…… . 并且所有写入都是相同的(唯一可能发生的修改是将其设置为 true)然后我看不到非原子性会导致问题的任何方式。

==添加==

以上对当前代码正确性的评论。作为代码库的一部分,还值得考虑代码在其上下文中的长期安全性。保留该代码原样,是为不知道/理解/识别正在发生的事情以及为什么它目前是安全的 future 开发人员设置陷阱。

如果你这样保留它,则必须对声明和单一用法进行明确的注释,解释发生了什么、为什么它是安全的,以及为什么他们不能开始读取/使用其他变量方式。

备选方案(添加锁定代码)从长远来看更安全,但性能也可能略有下降。

关于c# - 从多个线程写入 bool 变量在 C# 中安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39788625/

相关文章:

c++ - 在 C++ 中多线程时出现 "no matching function call"错误

Python 3.4并发.futures.Executor不提供暂停和恢复线程的控制

multithreading - Qt中的Qthreadpool

c# - 在 C# 中定义权限集的枚举

c# - Linq to entities - 在查询中包含 foreach

c# - “必须有”.NET 组件 : experienced developers?

c# - 嵌套并行 For 中的死锁风险

c# - 使用任务进行连续轮询

c# - 如何使用新的任务并行库确保两个任务在不同的线程甚至不同的处理器上运行?

c# - 什么是最快的 sql 实现,如 'x%' 在 c# 集合中的键