正如标题所示:有什么不同。我知道在QThreadStorage
关键字之前很久就存在thread_local
,这可能就是为什么它首先存在 - 但问题仍然存在:它们在这两者之间的作用是否有任何显着差异(除了QThreadStorage
)的扩展API。
我假设一个静态变量的正常用例 - 因为使用QThreadStorage
作为非静态是可行的,但不建议这样做。
static thread_local int a;
// vs
static QThreadStorage<int> b;
答案 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;
}
所以(可能这已经改变/将会改变)你不能将QThreadStorage
与QThread
之外的任何东西混合,而thread_local
关键字没有类似的限制。
2)在thread_local
上引用cppreference:
帖子存储时间。线程开始时分配对象,线程结束时分配对象。
查看qthreadstorage.cpp
,QThreadStorage
类实际上不包含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
我甚至都不确定。
我认为这两者足够重要,不会更深入。