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 变化)你不能将 QThreadStorage
与 QThread
以外的任何东西混合,而 thread_local
关键字没有类似的限制。
2) 在 thread_local
上引用 cppreference:
thread storage duration. The object is allocated when the thread begins and deallocated when the thread ends.
查看 qthreadstorage.cpp
,QThreadStorage
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
捕获它,我什至不确定。
我认为这两个足够重要,不再深入。
如题所示:有什么区别。我知道 QThreadStorage
早在 thread_local
关键字之前就存在了,这可能就是它首先存在的原因 - 但问题仍然存在:这两者之间的作用是否有显着差异(除了QThreadStorage
).
我假设静态变量的正常用例 - 因为使用 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 变化)你不能将 QThreadStorage
与 QThread
以外的任何东西混合,而 thread_local
关键字没有类似的限制。
2) 在 thread_local
上引用 cppreference:
thread storage duration. The object is allocated when the thread begins and deallocated when the thread ends.
查看 qthreadstorage.cpp
,QThreadStorage
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
捕获它,我什至不确定。
我认为这两个足够重要,不再深入。