Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
类实例的C#线程安全_C#_Multithreading - Fatal编程技术网

类实例的C#线程安全

类实例的C#线程安全,c#,multithreading,C#,Multithreading,我正在学习C#,我对类实例副本的线程安全性感到困惑,如下所示: eg: classA objA; classA objB = objA; objA.field1 = value2; //do I need lock around modification of field1? //let say we pass the objB to another thread objB.field1 = value1 //do I need a lock for objB becau

我正在学习C#,我对类实例副本的线程安全性感到困惑,如下所示:

eg:
  classA objA;
  classA objB = objA;

  objA.field1 = value2; //do I need lock around modification of field1?

  //let say we pass the objB to another thread
  objB.field1 = value1 //do I need a lock for objB because of the modification of field1?
<>我很困惑,因为C++背景下的C类是引用类型。如果objA和objB都引用相同的底层内存,那么我需要一个锁来保护对field1的同时写入。有人能证实这一点吗,还是我遗漏了什么


谢谢。

视情况而定。根据不同的标准,以下类型是原子的:
bool、char、byte、sbyte、short、ushort、uint、int、float、
和引用类型


如果Field1是其中的一个或引用,如果你没有任何依赖关系,C++就不需要锁。

< P>你提到C++背景,所以也许你可以把C代码看作C++代码:

classA objA;
classA &objB = objA; //note reference

objA.field1 = value2; //do I need lock around modification of field1?
                      //Answer : yes if someone else has access to the object
如果被多个线程修改/变异,则应锁定对象。这可以通过使用属性而不是公共字段轻松完成。或者使用简单的方法

有时修改基元类型不需要锁。但是对于大多数并发访问/变异情况,锁定是最简单和最安全的解决方案

//let say we pass the objB to another thread
//do I need a lock for objB because of the modification of field1?
Thread newThread = new Thread((classB b) => b.field1 = value1);

是的,只要对象是可变的。

原子性和线程安全通常是两个不同的问题。但我不是C#guru…是的,如果你在其他读写之间有依赖关系。但在这个(可能是简化的)示例中,您只有一次写入,不需要锁定来获得一致性。在大多数实际情况下,你是这样做的。