相关疑难解决方法(0)

C#中哪些操作是原子的?

是否有系统的方法来了解C#中的操作是否是原子操作?或者是否有任何一般指导方针或经验法则?

.net c# multithreading atomic

51
推荐指数
3
解决办法
3万
查看次数

是int吗?线程安全?

我知道,在.net所有32位类型(如int,bool等)是线程安全的.也就是说,不会有部分写入(根据规范).

但是,同样适用于int?(可空的int)吗?

.net c# int thread-safety

24
推荐指数
2
解决办法
1万
查看次数

阅读双重不是线程安全的吗?

更新:我在Eric Lippert另一个问题的回答中偶然发现了这个问题(他引用了这个规范):

其他类型的读写,包括long,ulong,double和decimal,以及用户定义的类型,不保证是原子的.

好了,阅读double不是原子.这意味着可以在读取中间修改该值,对吧?那么如何以double原子方式读取值?


我注意到有一种价值Interlocked.Read方法long.这对我来说很有意义,因为读取64位值必须需要两个步骤,因此就像其他所有非原子动作一样受到竞争条件的影响.

但目前还没有Interlocked.Readdouble价值观,即使System.Double是一个64位的值.

我在我的程序中看到一些奇怪的行为,我的GUI double在文本框中显示,而double其他线程也经常更新,在大多数时间显示正确的值(在200.0附近),然后偶尔随机显示错误值(如-0.08).

也许这是一个线程问题,或者也许是其他问题.但首先我想缩小可能性.那么:正在阅读double线程安全吗?

.net double thread-safety

15
推荐指数
3
解决办法
3551
查看次数

正在更新双重操作原子

在Java中,更新double和long变量可能不是原子变量,因为double/long被视为两个独立的32位变量.

http://java.sun.com/docs/books/jls/second_edition/html/memory.doc.html#28733

在C++中,如果我使用的是32位Intel Processor + Microsoft Visual C++编译器,那么更新双(8字节)操作原子?

我找不到关于这种行为的规范.

当我说"原子变量"时,这就是我的意思:

线程A试图将1写入变量x.线程B试图将2写入变量x.

我们将从变量x得到值1或2,但不是未定义的值.

c++ visual-c++

10
推荐指数
1
解决办法
6147
查看次数

标签 统计

.net ×3

c# ×2

thread-safety ×2

atomic ×1

c++ ×1

double ×1

int ×1

multithreading ×1

visual-c++ ×1