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

8
我需要在C++中从不同的线程执行一些操作,需要锁住所有可能被多个线程同时使用的变量,但是如果每个线程都访问(写入)同一对象的不同数据成员怎么办?例如,每个线程调用对象的不同方法,并且没有一个被调用的方法修改了同一数据成员。只要我不访问相同的数据成员,是安全的吗?还是我仍然需要锁定整个对象?
我已经查看了关于此主题的解释和详细信息,但每个示例似乎都集中在单个变量或非成员函数上。
总结一下: 我能否在没有对整个对象进行加锁的情况下安全地访问同一对象的2个不同数据成员并来自2个不同的线程?

你如何确保不会同时从两个线程访问同一个成员? - Aleksandr Kravets
你能否每个结构变量都有一个锁,而不是每个结构都有一个锁。细粒度锁定? - prathmesh.kallurkar
6个回答

5

如果您经常这样做,虽然它是安全的,但会显著降低您代码的性能。计算机使用所谓的“缓存行”,如果两个处理器在同一个缓存行上工作,它们将不得不一直互相传递,从而减慢您的工作速度。


1
如果数据成员没有正确对齐,这也可能是不安全的。 - user396672

3

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


1

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

所以这是可能的,但潜在的危险。但是这样做也会更快,因为你将避免调用获取互斥锁的操作。自己权衡吧。


1

嗯,没错,你可以这样做,但正如其他人所指出的,你不应该这样做。 在我看来,访问数据成员应该通过getter / setter方法进行,以便任何必要的互斥/临界区/信号量等都封装在对象内部。


0

只要我不访问相同的数据成员,那么它就是安全的吗?还是说我需要锁定整个对象?

答案完全取决于类的设计,但是我仍然建议在允许多个线程访问同一对象之前三思而后行。事实上,如果您确定数据是真正独立的,则无需锁定整个对象。

然后会出现一个不同的问题:"如果变量确实是独立的,为什么它们在同一个类中?" 如果弄错了,小心线程会导致程序崩溃。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接