Linux编程中的线程安全变量

时间:2010-02-23 23:16:39

标签: c++ thread-safety

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

资源类仅使用静态方法实现(参见下文)。它还使用全局对象(在匿名命名空间中作用域)。全局变量的原因是我不想将库的用户暴露给系统的内部。我想我可以使用一个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进行开发

3 个答案:

答案 0 :(得分:2)

如何在类中包装globvar对象并提供本身使用互斥锁的访问器/更改器?这应该给你一些线程安全。

答案 1 :(得分:1)

在您可以访问的任何地方,将您的对象包装在可重入的锁中:)这里有一些C ++代码允许您实现锁定机制。但需要提升:

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

看起来很酷:)

LOCK (myObject) {
    do something with myObject
}

请务必查看评论,以查看人们对代码所做的任何修改。

答案 2 :(得分:0)

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

关于TLS的好处是,不需要互斥锁,所以没有阻塞。