【问题标题】:Thread-safe variables in Linux programmingLinux 编程中的线程安全变量
【发布时间】:2010-02-23 23:16:39
【问题描述】:

我正在编写一个允许链接应用程序查询资源的共享库。

资源类仅使用静态方法实现(见下文)。它还使用一个全局对象(在匿名命名空间中很好地限定了范围)。全局变量的原因是我不想将库的用户暴露给系统内部。我想我可以使用 pimpl 成语,但这仍然不能解决线程安全问题。

这个类看起来像这样:

//Header
class A
{
  public:
     static int foo();
     static double foobar();
};


// Source
namespace
{
   SomeResourceObject globvar;  // <- how can this variable be made thread safe ?
}

int A::foo(){}
double A::foobar(){}

使用这个库的一些应用程序将是多线程的,因此可能会从不同的线程调用 A 上的方法。

因此,我的问题是如何实现 globvar 以实现线程安全?

我正在 Ubuntu 9.10 上使用 gcc 4.4.1 进行开发

【问题讨论】:

  • 不可变对象总是线程安全的。
  • @John Knoeller:OP 从来没有提到不可变,想知道你从哪里选择的。全局状态总是可以修改的。
  • 这是一个建议,而不是观察。

标签: c++ thread-safety


【解决方案1】:

如何将globvar 对象包装在一个类中并提供本质上使用互斥锁的访问器/突变器?这应该会给你一些线程安全性。

【讨论】:

    【解决方案2】:

    将要操作的对象包装在可重入锁中,无论您在何处访问它:) 这里有一些 C++ 代码,可让您实现锁定机制。不过需要提升:

    http://the-lazy-programmer.com/blog/?p=39

    看起来很酷:)

    LOCK (myObject) {
        do something with myObject
    }
    

    确保查看 cmets 以了解人们对代码所做的任何修复。

    【讨论】:

    • 是的,我认为这可以解决问题。我已经在我的代码中使用了 boost 线程,所以这对我来说很有效。谢谢
    【解决方案3】:

    如果您不需要在线程之间共享 globvar 并且您没有产生大量线程,您还应该考虑使用 thread-local storage

    TLS 的伟大之处在于,不需要互斥体,因此没有阻塞。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-24
      • 2013-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-03
      相关资源
      最近更新 更多