我有一些对象需要从 C++ 中的不同线程执行操作。我知道有必要锁定可能被多个线程同时使用的任何变量,但是如果每个线程都访问(写入)同一对象的不同数据成员怎么办?例如,每个线程调用对象的不同方法,并且调用的方法都没有修改相同的数据成员。只要我不访问相同的数据成员或者我需要锁定整个对象是否安全?
我四处寻找有关此主题的解释和详细信息,但每个示例似乎都集中在单个变量或非成员函数上。
总结一下:我可以安全地从 2 个不同的线程访问同一个对象的 2 个不同的数据成员,而不用锁定整个对象吗?
我有一些对象需要从 C++ 中的不同线程执行操作。我知道有必要锁定可能被多个线程同时使用的任何变量,但是如果每个线程都访问(写入)同一对象的不同数据成员怎么办?例如,每个线程调用对象的不同方法,并且调用的方法都没有修改相同的数据成员。只要我不访问相同的数据成员或者我需要锁定整个对象是否安全?
我四处寻找有关此主题的解释和详细信息,但每个示例似乎都集中在单个变量或非成员函数上。
总结一下:我可以安全地从 2 个不同的线程访问同一个对象的 2 个不同的数据成员,而不用锁定整个对象吗?
它实际上是安全的,但如果您经常这样做,会大大降低代码的性能。计算机使用称为“缓存线”的东西,如果两个处理器在同一个缓存线上工作,他们将不得不一直来回传递它,从而减慢您的工作速度。
是的,通过不同的线程访问一个对象的不同成员是安全的。
我认为你可以做到这一点。但是您最好确保方法内部永远不会更改以访问相同的数据,或者调用程序不会决定调用另一个线程已经在使用的另一个方法等。
如此可能,但有潜在危险。但是它也会更快,因为您将避免调用获取互斥锁。选择你的毒药。
好吧,是的,你可以这样做,但是正如其他人所指出的,你不应该这样做。恕我直言,对数据成员的访问应该通过 getter/setter 方法,以便任何必要的互斥/关键部分/信号/任何东西都封装在对象中。
你可能要小心。参见例如http://gcc.gnu.org/ml/gcc/2012-02/msg00032.html 根据访问字段的方式,您可能会遇到类似的难以发现的问题。
只要我不访问相同的数据成员或者我需要锁定整个对象是否安全?
答案完全取决于类的设计,但是我仍然建议在允许多个线程访问同一个对象之前考虑 100 次。鉴于这一事实,如果您确定数据确实是独立的,则无需锁定整个对象。
然后出现了一个不同的问题,“如果变量确实是独立的,为什么它们在同一类中?” 如果弄错了,小心穿线会导致死亡。