类实例的C#线程安全
我正在学习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
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…是的,如果你在其他读写之间有依赖关系。但在这个(可能是简化的)示例中,您只有一次写入,不需要锁定来获得一致性。在大多数实际情况下,你是这样做的。