QThreadStorage vs C ++ 11 thread_local

时间:2018-06-14 10:00:40

标签: qt c++11 thread-local-storage

正如标题所示:有什么不同。我知道在QThreadStorage关键字之前很久就存在thread_local,这可能就是为什么它首先存在 - 但问题仍然存在:它们在这两者之间的作用是否有任何显着差异(除了QThreadStorage)的扩展API。

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

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

1 个答案:

答案 0 :(得分:1)

好吧,既然Qt是开源的,你基本上可以从Qt源中找出答案。我目前正在查看5.9,这里有一些我将其归类为重要事项:

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;
}

所以(可能这已经改变/将会改变)你不能将QThreadStorageQThread之外的任何东西混合,而thread_local关键字没有类似的限制。

2)在thread_local上引用cppreference

  

帖子存储时间。线程开始时分配对象,线程结束时分配对象。

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

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

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

我认为这两者足够重要,不会更深入。