我可以使用Qt线程ID为每个线程创建唯一的缓存吗?

时间:2017-08-22 12:37:06

标签: c++ multithreading qt

我想缓存非线程安全的延迟加载对象。每个线程都应该拥有自己的一组对象。

我的想法是创建QMap<int, MyObject>并通过我使用QThread::currentThreadId()获得的主题ID访问此地图。映射本身将受到读/写互斥锁的保护(即,用于写入的唯一锁,用于读取的共享锁)。它不会经常被激活。

我不确定这是不是一个好主意。这种方法有什么问题吗?

2 个答案:

答案 0 :(得分:3)

从官方文档(http://doc.qt.io/qt-4.8/qthread.html#currentThreadId

  

警告:此函数返回的句柄用于内部目的,不应在任何应用程序代码中使用。

看起来这个函数不能用作公共函数,因此以任何方式在您的应用程序中使用它可能不是一个好主意

您是否考虑使用std::this_thread::get_id()或使用thread_local静态对象?

答案 1 :(得分:1)

尝试http://doc.qt.io/qt-5/qthreadstorage.html

Examplecode:

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