C++11中的thread_local在gcc中的替代方案

6
4个回答

7

我尝试过,但失败了。简单的代码:__thread int a; 会产生一个错误:error: storage class specified for 'a'。 - Dejwi
如果我添加static关键字,一切都很好。但是,属于同一线程的类的所有对象将在它们之间共享此变量。 - Dejwi
4
这就是线程本地存储的定义!它不能针对特定对象(请使用字段来实现)!除非你将对象作为局部变量在堆栈上分配,否则对象不属于特定线程! - Basile Starynkevitch
1
@Basile 但即使如此,您仍然可以将对象的引用或指针传递给另一个线程。(通常不是一个好主意,但我愿意打赌有人有一个明智的用途。) - Donal Fellows

4

4
根据这个GCC文档页面,你应该尝试使用__thread作为线程本地存储的限定符(就像volatileconst一样)。

0
这是一个使用__thread编译器扩展的示例(上面没有看到)。它用于为每个线程创建名为ServiceLocator的单例。
因此,这是(缩写)标题。在这里,我将线程本地变量作为类的成员。
class ServiceLocator :  public ImmutableServiceLocator {
private:
    static __thread ServiceLocator* locator;
public:
    void ServiceLocator::setAsServiceLocator();
    ImmutableServiceLocator& ServiceLocator::getServiceLocator();
};

然后你必须在你的实现中放置一个线程本地变量的声明,否则你的链接器会感到困惑(我不知道为什么,抱歉),你可以像处理静态变量一样处理线程本地变量:

__thread ServiceLocator* ServiceLocator::locator;


void ServiceLocator::setAsServiceLocator() {
    locator = this;
}

ImmutableServiceLocator& ServiceLocator::getServiceLocator() {
    return *locator;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接