2012-04-26 28 views
5

我有几个对象需要在C++中的不同线程上执行操作。我知道有必要同时锁定多个线程可能使用的变量,但是如果每个线程正在访问(写入)同一对象的不同数据成员,该怎么办?例如,每个线程正在调用对象的不同方法,并且没有任何方法调用相同的数据成员。只要我不访问相同的数据成员,还是需要锁定整个对象,是否安全?从C++中的2个不同线程访问属于同一对象的不同数据成员

我已经找过解释和这个主题的细节,但每个例子似乎集中在单个变量或非成员函数。

总结: 我可以安全地访问同一对象的2名不同的数据成员来自2个不同的线程,但不将锁定整个对象呢?

+0

您如何确保您永远不会从两个线程同时访问同一个成员? – 2012-04-26 13:54:34

+0

不能为每个结构变量锁定一个锁,而不是每个结构锁。细粒锁定?? – 2012-04-26 13:55:10

回答

4

它是有效的安全措施,但如果您经常这样做,会严重降低代码的性能。计算机使用称为“高速缓存行”的东西,如果两个处理器在同一高速缓存行上工作,则他们必须始终将其传回&,从而减慢工作速度。

+0

+1虚假分享 – 2012-04-26 13:58:12

+1

如果数据成员没有正确对齐,它也可能是不安全的 – user396672 2012-04-26 15:56:37

2

是的,通过不同的线程访问一个对象的不同成员是安全的。

1

我认为你可以做到这一点。但是最好确保方法内部不会改变访问相同的数据,或者调用程序不会决定调用另一个线程已经在使用的另一种方法。

所以可能,但潜在的危险。但是它也会更快,因为你将避免调用获得互斥体。选择你的毒药。

0

只要我不访问相同的数据成员,或者我是否需要锁定整个对象,它是否安全?

答案完全取决于类的设计,但我仍然会说,总是建议在允许多个线程访问同一对象之前考虑100次。鉴于事实,如果您确定数据是确实独立他们是需要锁定整个对象。

然后出现一个不同的问题,“如果变量确实是独立的为什么他们在同一类?”如果弄错了,请小心穿线。

0

嗯,是的,你可以做,但是,正如其他人指出的,你不应该这样做。恕我直言,对数据成员的访问应该通过getter/setter方法,以便任何必要的mutexing/criticalSectioning/semaphoring /封装在对象内的任何东西。

相关问题