QVector项目共享相同的缓存行吗?

时间:2015-05-04 00:45:17

标签: c++ multithreading qt caching

我们说我有一个QVector存储这些元素: {3,4,1,5,6}。因此,如果我从不同的线程中读取每个元素,这会导致错误共享吗? (通过'阅读'我的意思是:int i = vector[0]; //no change involved

使用' read'的相同概念,当读取'时,矢量的单个元素被视为共享资源。它来自不同的线程?

2 个答案:

答案 0 :(得分:2)

是的,每个缓存行可以使用多个元素,因为QVector将其元素连续存储在内存中(std::vector也是如此)。

因此可能会发生错误共享,但在现代处理器上,如果修改了缓存行,它只会导致性能下降 - 这不在您的示例中。

  

当向量时,向量的单个元素被视为共享资源   从不同的线程“读取”它?

这取决于你所说的'共享资源'。如果你的意思是标记为共享的缓存行,那么只是因为缓存行包含元素,所以元素本身没什么特别的。

如果您实际上是指Qt的隐式共享机制(QVector使用),则不会将单个元素视为共享资源,因为引用计数发生在容器级别。

答案 1 :(得分:1)

QVector和Qt的所有来源都可供检查。

http://code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/tools/qvector.h

http://code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/tools/qvector.cpp

http://code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/tools/qvector_msvc.cpp

官方文件说:

http://doc.qt.io/qt-5/qvector.html#details

  

QVector<T>是Qt的通用容器类之一。它存储它   相邻内存位置中的项目,并提供快速索引   访问。

有很多关于使用[]运算符v。使用at(int index) v。使用data()访问数组元素的说明。

Qt线程安全在这里清楚阐明:

http://doc.qt.io/qt-5/threads-reentrancy.html

http://doc.qt.io/qt-5/thread-basics.html

http://doc.qt.io/qt-5/threads-synchronizing.html

等等。