QThreadStorage 类

template <typename T> class QThreadStorage

QThreadStorage 类提供每线程数据存储。 更多...

头: #include <QThreadStorage>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core

注意: 此类的所有函数 thread-safe .

公共函数

QThreadStorage ()
~QThreadStorage ()
bool hasLocalData () const
T & localData ()
T localData () const
void setLocalData (T data )

详细描述

QThreadStorage 是提供每线程数据存储的模板类。

The setLocalData () 函数为调用线程存储单特定线程值。以后数据可以被访问使用 localData ().

The hasLocalData () 函数允许程序员确定先前是否有设置数据使用 setLocalData () function. This is also useful for lazy initialization.

若 T 是指针类型,QThreadStorage 拥有数据的所有权 (必须在堆上被创建采用 new ) 并在线程正常退出或凭借终止退出时删除它。

例如,以下代码使用 QThreadStorage 为每个调用 cacheObject() 和 removeFromCache() 函数的线程存储单缓存。缓存被自动删除,当调用线程退出时。

QThreadStorage<QCache<QString, SomeClass> > caches;
void cacheObject(const QString &key, SomeClass *object)
{
    caches.localData().insert(key, object);
}
void removeFromCache(const QString &key)
{
    if (!caches.hasLocalData())
        return;
    caches.localData().remove(key);
}
					

告诫

  • QThreadStorage 析构函数不删除每线程数据。QThreadStorage 才删除每线程数据当线程退出时或当 setLocalData () 被多次调用。
  • QThreadStorage 可以用于存储数据为 main() 线程。QThreadStorage 会删除所有数据集为 main() 线程当 QApplication 被销毁,不管是否 main() 线程实际已完成。

另请参阅 QThread .

成员函数文档编制

QThreadStorage:: QThreadStorage ()

构造新的每线程数据存储对象。

QThreadStorage:: ~QThreadStorage ()

销毁每线程数据存储对象。

注意:存储的每线程数据不会被删除。任何数据留在 QThreadStorage 会被泄漏。确保所有线程使用 QThreadStorage 已退出再删除 QThreadStorage .

另请参阅 hasLocalData ().

bool QThreadStorage:: hasLocalData () const

若 T 是指针类型,返回 true 若调用线程有非零可用数据。

若 T 是值类型,返回数据是否已经被构造通过调用 setLocalData or localData .

另请参阅 localData ().

T &QThreadStorage:: localData ()

返回由调用线程设置的数据的引用。

若未设置数据,这将创建默认 T 类型构造实例。

另请参阅 setLocalData () 和 hasLocalData ().

T QThreadStorage:: localData () const

这是重载函数。

返回由调用线程设置的数据的副本。

另请参阅 hasLocalData ().

void QThreadStorage:: setLocalData ( T data )

把调用线程的本地数据设为 data 。以后可以访问它使用 localData () 函数。

若 T 是指针类型, QThreadStorage 拥有数据的所有权,并自动删除它当线程退出 (正常或凭借终止) 时或当 setLocalData() 被再次调用。

另请参阅 localData () 和 hasLocalData ().