本页内容

QThreadStorage Class

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

注意:该类中的所有函数均是线程安全的。

公共函数

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

详细说明

QThreadStorage 是一个模板类,其中模板参数T 指定了每个线程存储的数据类型。

setLocalData() 函数为调用线程存储一个线程特定的值。稍后可以使用localData() 访问该数据。

hasLocalData() 函数允许程序员确定数据是否曾通过setLocalData() 函数设置过。这对于懒加载初始化也很有用。

如果 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);
}

注意事项

  • 在线程或程序关闭期间调用hasLocalData()、localData() 或setLocalData(),可能会为当前线程重新创建线程本地存储,而之后将没有任何机制来销毁它。
  • QThreadStorage 的析构函数不会删除线程级数据。QThreadStorage 仅在线程退出或多次调用setLocalData() 时才会删除线程级数据。
  • QThreadStorage 可用于存储main() 线程的数据。当QApplication 被销毁时,QThreadStorage 会删除为main() 线程设置的所有数据,无论main() 线程是否已实际结束。

另请参阅 QThread 。

成员函数文档

QThreadStorage::QThreadStorage()

创建一个新的、按线程划分的数据存储对象。

QThreadStorage::~QThreadStorage()

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

注意:存储的每个线程的数据不会被删除。QThreadStorage 中残留的任何数据都会导致内存泄漏。在删除QThreadStorage 之前,请确保所有使用QThreadStorage 的线程均已退出。

另请参阅 hasLocalData()。

bool QThreadStorage::hasLocalData() const

如果 T 是指针类型,则当调用线程有非零数据可用时,返回true 。

如果 T 是值类型,则返回该数据是否已通过调用setLocalData 或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()。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.