multithreading - 如果我有 1 个线程写入和 1 个线程读取 int32,它是线程安全的吗?

标签 multithreading thread-safety int

我正在使用 C#,我需要知道在不使用任何 volatile 或锁的情况下,1 个线程读取和 1 个线程写入是否安全。我只会读/写 32 位整数和 bool 值。

最佳答案

这几乎就是线程不安全代码的定义。如果您分析线程代码中的需求,那么您总是会寻找这种模式。如果不锁定,则读取的线程将观察到变量的随机更改,与其执行完全不同步,并且时间完全随机。

从 C# 内存模型中获得的唯一保证是 intbool 更新是原子。这是一个昂贵的词,意味着您不会意外读取某个值,其中该值中的某些字节具有新值而某些字节具有旧值。这将产生一个完全随机的数字。并非每个值更新都是原子的,longdouble 和结构类型(包括 Nullable<> 和 decimal)都不是原子的。

在必要时不锁定会产生极难调试的问题。它们取决于时序,并且程序往往会陷入时序变化不大的执行模式。但是,例如,当机器被另一任务占用时,情况可能会突然发生变化。您的程序可能会正常运行一周,然后当您收到电子邮件时会失败一次:) 这是无法调试的。

关于multithreading - 如果我有 1 个线程写入和 1 个线程读取 int32,它是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26436249/

相关文章:

python - 运行多个python脚本和多处理有什么区别

java - 更新 unmodifiedMap 线程的引用是否安全

c# - 这个非锁定的 TryGetValue() 字典访问线程安全吗?

java - 如果变量仅被一个线程访问,但通过其他线程的 lambda 传递,Java 是否需要 volatile 关键字?

python:将列表中的整数项连接为单个字符串

php - 手动从 php 中的字符串乘以 float 和整数会给出不同的结果

c++ - 声明一个带有预处理器宏的字符?

java - 如何创建生产者/消费者线程模式?

c# 如何重构我的线程程序

java - 如何在 java 中运行一个线程,让我知道另一个线程何时死亡?