从C ++中的2个不同线程访问属于同一对象的不同数据成员

时间:2012-04-26 13:51:48

标签: c++ multithreading class datamember

我需要一些对象来从c ++中的不同线程执行操作。我知道有必要锁定可能同时由多个线程使用的任何变量,但是如果每个线程正在访问(写入)同一对象的不同数据成员,该怎么办?例如,每个线程调用对象的不同方法,并且所调用的方法都不会修改相同的数据成员。只要我不访问相同的数据成员或者我是否需要锁定整个对象,它是否安全?

我四处寻找有关此主题的解释和详细信息,但每个示例似乎都集中在单个变量或非成员函数上。

总结一下: 我可以安全地从2个不同的线程访问同一对象的2个不同的数据成员,而不会锁定整个对象吗?

6 个答案:

答案 0 :(得分:4)

它实际上是安全的,但如果经常这样做,会大大降低代码的性能。计算机使用称为“缓存行”的东西,如果两个处理器在同一缓存行上工作,则必须将它传回去。一直在前进,放慢你的工作。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

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

然后出现了另一个问题,“如果变量确实是独立的,为什么它们属于同一类?”如果错误,请小心线程杀死。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

你可能要小心。请参阅示例http://gcc.gnu.org/ml/gcc/2012-02/msg00032.html 根据字段的访问方式,您可能遇到类似难以发现的问题。