【发布时间】:2016-03-02 02:20:55
【问题描述】:
假设我有一个二维向量
vector< vector< int> > v
然后线程1对v[0]进行操作,如
v[0].push_back(x)
线程 2 在 v[1] 上运行,
v[1].remove(y)
等等
这个操作线程安全吗?我想是的,因为v[0] 和v[1] 是指向不同内存地址的独立指针?这两个指针最终会重叠吗?
【问题讨论】:
-
v[0] 和 v[1] 是不同的向量,[] 运算符在访问不同元素时是安全的。 cplusplus.com/reference/vector/vector/operator[]
-
但是,由于 v[0] 和 v[1] 在内存中是相邻的,因此从两个不同的线程重复访问它们(我的意思是对象本身而不是它们的数据)可能不利于并发性能。
-
虚假分享。 'v' 是一个向量对象,它指向一个包含向量对象 v[0], v[1], ... 的连续内存块。由于内存是连续的,因此 v[0] 和 v[1] 驻留在同一缓存行中(在不同的内核中)。修改使高速缓存行无效。 software.intel.com/en-us/articles/…
-
他们自己改变了 v[0] 和 v[1] - 他们改变了内部长度字段。由于 v[0] 和 v[1] 在内存中是相邻的,这会导致错误共享。你也错了,因为 v[0].push_back 会改变 v[0] 指向的内存,尽管那是无关紧要的——否则它将如何将参数复制到向量中?
-
这很有帮助!谢谢!
标签: multithreading c++11 stl thread-safety stdvector