我正在编写一个共享库,允许链接的应用程序查询资源。
资源类仅使用静态方法实现(参见下文)。它还使用全局对象(在匿名命名空间中作用域)。全局变量的原因是我不想将库的用户暴露给系统的内部。我想我可以使用一个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进行开发
答案 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的好处是,不需要互斥锁,所以没有阻塞。