【问题标题】:Using static mutex in a class在类中使用静态互斥锁
【发布时间】:2011-01-28 14:38:29
【问题描述】:

我有一个可以有很多实例的类。它在内部创建并初始化来自 3rd 方库的一些成员(使用一些全局变量)并且不是线程安全的。

我考虑过使用静态 boost::mutex,它会被锁定在我的类构造函数和析构函数中。因此,在我的线程中创建和销毁实例对于第 3 方成员来说是安全的。

class MyClass { static boost::mutex mx; // 3rd party library members public: MyClass(); ~MyClass(); }; MyClass::MyClass() { boost::mutex::scoped_lock scoped_lock(mx); // create and init 3rd party library stuff } MyClass::~MyClass() { boost::mutex::scoped_lock scoped_lock(mx); // destroy 3rd party library stuff }

我无法链接,因为我收到错误:

undefined reference to `MyClass::mx`
  1. 我需要对此类静态成员进行一些特殊初始化吗?

  2. 使用静态互斥锁有什么问题吗?


编辑:链接问题已通过 cpp 中的正确定义得到修复

boost::mutex MyClass::mx;

【问题讨论】:

  • 如果您使用静态互斥锁,您将序列化您的类的所有实例的使用,完全否定您可能通过多线程获得的任何好处。你确定要这个吗?
  • @John Dibling 是的,只有创建和销毁对象才会受到保护——它不会经常发生。其余时间将在不锁定互斥锁的情况下使用实例,它应该非常有效。
  • @Dmity:这引出了我的下一个问题:您确定在不锁定的情况下使用实例是安全的吗?
  • @John Dibling 第 3 方库提供了一些锁定机制,可以保证线程安全的工作,但它们需要现有的对象 - 我的测试表明它正在工作。看起来虽然这些对象的并发创建不是很安全。
  • 请记住,classstatic 数据成员将在派生类的 AND 类实例的所有实例之间共享。您可能需要重新考虑 static 限定符。

标签: c++ linux multithreading boost


【解决方案1】:

您已声明但未定义您的类静态互斥锁。只需添加一行

boost::mutex MyClass::mx;

到 cpp 文件中执行 MyClass。

【讨论】:

  • 10x,它确实解决了链接问题。我之前尝试过定义它,但错过了 MyClass::mx 之前的类型
  • 为什么需要这个?声明和定义有什么区别?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-19
  • 2018-05-23
  • 1970-01-01
  • 1970-01-01
  • 2013-12-10
  • 1970-01-01
  • 2015-05-31
相关资源
最近更新 更多