我想缓存非线程安全的延迟加载对象。每个线程都应该拥有自己的一组对象。
我的想法是创建QMap<int, MyObject>
并通过我使用QThread::currentThreadId()
获得的主题ID访问此地图。映射本身将受到读/写互斥锁的保护(即,用于写入的唯一锁,用于读取的共享锁)。它不会经常被激活。
我不确定这是不是一个好主意。这种方法有什么问题吗?
答案 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);
}