gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:36:19 27 4
gpt4 key购买 nike

我需要检查 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com