从线程内的对象调用静态方法

时间:2018-02-11 18:47:21

标签: c++

我在类中有一个静态函数:

class ABC {
  public: 
    static void calculate() 
    {
      //...
    }
};

我有另一个班级:

Class DEF
{
  public:
    void doCalculation()
    {
      ABC::calculate();
    }
};

DEF的对象是每个线程一个,也就是说,我们有n个线程可以同时访问calculate()

在这种情况下,我应该锁定通话ABC::calculate()吗?

1 个答案:

答案 0 :(得分:2)

请仔细考虑:锁应该保护数据,而不是代码。如果你教自己在函数调用周围放置锁,那么你将永远进行调试。

解决方案:

  • 如果calculate()仅访问静态(不更改)数据,则不需要 完全同步。
  • 如果calculate()包含共享变量的简单增量 (int / float),使用std::atomic<>。请注意,原子是方式 比任何竞争锁定都快。
  • 如果calculate()使用多个变量和/或更大的结构,请考虑使用libguarded
  • 如果calculate()确实是访问数据的唯一方法,请使用std::lock_guard<>。至少你可以免费获得异常安全。