我们说我有一个QVector存储这些元素:
{3,4,1,5,6}。因此,如果我从不同的线程中读取每个元素,这会导致错误共享吗? (通过'阅读'我的意思是:int i = vector[0]; //no change involved
)
使用' read'的相同概念,当读取'时,矢量的单个元素被视为共享资源。它来自不同的线程?
答案 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
等等。