【发布时间】:2018-09-23 23:32:31
【问题描述】:
我最近使用了一个对象,其目的是作为单例分配和释放内存。类似的东西
class MyValue
{
// ...
static Allocator& GetAllocator()
{
static Allocator allocator;
return allocator;
}
// ...
};
后来我意识到Allocator 不是线程安全的:当多个线程同时使用同一个分配器时,偶尔会发生奇怪的事情,导致断言和分段错误。
解决方案:为不同的线程使用不同的分配器:
class MyValue
{
// ...
static Allocator& GetAllocator()
{
thread_local static Allocator allocator;
return allocator;
}
// ...
};
太棒了!我的问题都没有了!只有一个问题: 是否会在每次创建线程时初始化我的分配器变量,即使大多数线程不会使用此变量?
分配器的初始化可能是繁重的操作,所以我希望它只在实际需要时才初始化,而不是在每个线程中。
我读到thread_local 变量由每个线程分配。这是否意味着它们也是构造的?这种分配(或构造)是针对每个创建的线程系统地发生还是仅针对使用它的线程?
我隐约记得在一门课程中听到关于线程和线程本地存储的大多数细节都依赖于平台。如果是这样的话,我对 Linux 和 FreeBSD 尤其感兴趣。
相关(有趣的读物,但我在那里找不到答案):
【问题讨论】:
-
您确定应该使用
static Allocator GetAllocator()而不是static Allocator& GetAllocator()吗?单例模式是后者 -
另外,thread_local 在 C++11 中是什么意思? 似乎回答了你的问题:线程本地的东西在线程创建时就存在了并在线程停止时处理。 即构造和销毁
-
@NathanOliver:好点。对,它返回一个左值引用。我会在问题中纠正这一点。
标签: c++ multithreading c++11 thread-local-storage