QThreadStorage 与 C++11 thread_local

QThreadStorage vs C++11 thread_local

如题所示:有什么区别。我知道 QThreadStorage 早在 thread_local 关键字之前就存在了,这可能就是它首先存在的原因 - 但问题仍然存在:这两者之间的作用是否有显着差异(除了QThreadStorage).

的扩展 API

我假设静态变量的正常用例 - 因为使用 QThreadStorage 作为非静态是可能的,但不建议这样做。

static thread_local int a;
// vs
static QThreadStorage<int> b;

好吧,由于 Qt 是开源的,您基本上可以从 Qt 源代码中找到答案。我目前正在查看 5.9,这里有一些我认为 class 很重要的东西:

1) 查看 qthreadstorage.cpp,get/set 方法的开头都有这个块:

QThreadData *data = QThreadData::current();
if (!data) {
    qWarning("QThreadStorage::set: QThreadStorage can only be used with threads started with QThread");
    return 0;
}

所以(也许这有 changed/will 变化)你不能将 QThreadStorageQThread 以外的任何东西混合,而 thread_local 关键字没有类似的限制。

2) 在 thread_local 上引用 cppreference:

thread storage duration. The object is allocated when the thread begins and deallocated when the thread ends.

查看 qthreadstorage.cppQThreadStorage class 实际上不包含 T 的任何存储空间,实际存储空间是在第一次 get 调用时分配的:

QVector<void *> &tls = data->tls;
if (tls.size() <= id)
    tls.resize(id + 1);
void **v = &tls[id];

所以这意味着这两者之间的生命周期是完全不同的 - 使用 QThreadStorage 你实际上有更多的控制权,因为你创建对象并使用 setter 设置它,或者默认使用 setter 初始化getter。例如。如果类型的 ctor 可以抛出,使用 QThreadStorage 你可以用 thread_local 捕获它,我什至不确定。

我认为这两个足够重要,不再深入。