【问题标题】:two dimension STL vector thread safe?二维 STD 向量线程安全吗?
【发布时间】: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


【解决方案1】:

使用 Intel 提供的 concurrent_vector。

https://software.intel.com/en-us/node/506203

【讨论】:

猜你喜欢
  • 2017-12-23
  • 2017-05-08
  • 1970-01-01
  • 1970-01-01
  • 2010-11-24
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
  • 2020-08-24
相关资源
最近更新 更多