|
|
1
8
不,.NET中的结构本质上不是线程安全的。 然而,按值复制的语义认为,结构与这种转换有很大的相关性。 如果要传递结构并以某种方式将其分配给变量或传递值参数(没有ref或out关键字),则 复制 正在被使用。 当然,这意味着对副本所做的任何更改都不会反映在原始结构中,但是在传递它们时需要注意。 如果您以不涉及按值复制语义的方式直接访问结构(例如,访问结构类型的静态字段,以及 Marc Gravel points out in his answer ,还有许多其他方法)跨多个线程,然后必须考虑实例的线程安全性。 |
|
2
9
好吧-最佳实践是结构应该始终是不可变的(除了在一些非常具体的场景中,甚至在有风险的情况下)。不可变数据总是线程安全的。因此,如果您遵循最佳实践并做到了这一点:
那么是的,这是线程安全的。在所有其他情况下,答案是“可能不是”。
还要注意原子性规则适用,因此即使是单个读取或更新
|
|
|
3
1
一
此外,可变结构是代码气味。你有什么特别的理由需要它成为
|
|
|
4
0
不同线程对可变结构的不同成员的直接读写不会相互干扰。不同线程通过互锁方法访问同一成员的行为将根据这些方法的语义进行。这些事实可能允许可变结构允许线程安全行为。 除了完全替换之外,不提供任何突变方式的存储结构所在的可变存储位置不提供线程安全性,但在结构包含单个32位整数或单个对象引用的情况下,尝试在写入此类(单个项)结构存储位置的同时读取它是保证完全读取旧数据或完全读取新数据。请注意,不可能将任何互锁方法与不可变的结构(甚至只包含单个整数或对象引用的结构)一起使用。 |
|
5
0
不,他们不是。 我创建了一个非常简单的应用程序来查看10/10生产者/消费者线程是否访问同一个结构变量。最后,您将看到debugger.break();将被命中。银行余额不应低于0。
|
|
|
6
-2
不,为什么它是线程安全的?只是数据而已。它不会因为魔法而变得安全。 |
|
|
ron burgundy · 获取-释放语义是否跨线程传递?[副本] 1 年前 |
|
|
H3007 · 并发运行python子进程似乎不是并发的 1 年前 |
|
|
The Oddler · TVar会阻止读取直到更改吗? 1 年前 |
|
|
Wang Tuma · 使用信号量的c++并发问题:按顺序打印 1 年前 |
|
|
Marcel Batista · 在不同线程中更新密钥时的字典线程安全 2 年前 |
|
|
rico · 当volatile关键字真的是必要的? 2 年前 |