【问题标题】:Thread-safety for static class data members静态类数据成员的线程安全
【发布时间】:2018-04-28 01:07:11
【问题描述】:

我可以为 C++ 中的静态类数据成员假设线程安全吗?在下面的例子中,SetCounter 是线程安全的吗?

class Foo {
public:
  static void SetCounter(int c) { counter = c; }  
private:
  static int counter = 0;
}

【问题讨论】:

  • 不,静态类成员没有任何神奇的线程安全属性。它们只是具有花哨名称的全局变量。
  • 添加到这个;如果您的类只有静态成员,您可能需要考虑使它们成为非静态成员,在类中放置一个互斥锁以使类线程安全,然后使用该类的静态/单例实例来代替..作为另一种选择.
  • @IgorTandetnik 但是局部静态变量可以,我们可以在制作单例类时依赖该属性。是否有任何 C++ 文档解释了哪些类型的静态是线程安全的?
  • 不,局部静态变量也不是线程安全的。只有它们的初始化是,而不是后续使用。

标签: c++


【解决方案1】:

线程安全是指使动作独立于其他动作以避免竞争条件。如果你有 2 个线程,一个调用 SetCounter(1),另一个调用 SetCounter(2),你不能保证 counter 会被设置成什么。您需要对该值使用互斥锁/锁,以防止它被其他线程修改。如果你使用 boost 之类的库,可以参考Synchronization page。否则,请使用您自己的互斥锁来切换它是锁定还是解锁。

【讨论】:

  • 我知道什么是线程安全。我应该更好地解释我的问题来自哪里。见我上面的评论
猜你喜欢
  • 2013-12-10
  • 2011-11-29
  • 1970-01-01
  • 2011-01-28
  • 1970-01-01
  • 2012-09-22
  • 2015-03-24
  • 2012-03-10
  • 2010-12-30
相关资源
最近更新 更多