【发布时间】:2010-03-03 02:48:10
【问题描述】:
C++ STL 中定义的向量是可重入的还是线程安全的? 我可以在不使用互斥锁的情况下使用两个线程并在向量的两半上工作(在这种情况下是排序)吗? 例如:
int size = (Data_List.size())/2;
Thread A()
{
................ // Do we need to lock Data_list with a mutex
sort(Data_List.begin(),Data_List.begin()+size,cmp);
}
Thread B()
{
....// Do we need to lock Data_list with a mutex
sort(Data_List.begin()+(size+1),Data_List.end(),cmp);
}
我的问题是我们是否需要使用互斥锁来锁定 Data_List 的访问?
注意:cmp 函数是一个常规的 int 比较函数。
【问题讨论】:
-
我不知道这是否真的给你买了什么,当你完成每一半的排序时,列表仍然没有排序。您仍然需要将这两部分排序/合并在一起
-
@John:我正在使用 Threads 实现示例排序,然后使用递归加倍将两半合并在一起排序......我想知道我是否可以只使用偏移量并处理相同的数据结构,无需创建额外副本和单独处理副本的开销......
-
好的,我同意所有其他答案 - 只要您在排序期间不更改向量中的元素数量,应该没问题。
-
@John - 分而治之是并行化背后的原则之一。如果数据集足够大,它当然会买东西。
-
@Tom:如果排序使内存带宽饱和(简单的 int 比较表明会如此),那么将每个元素移动两次只会让事情变得更糟而不是更好。对于溢出内存的排序,它可以看到这将有什么帮助,但我怀疑如果整个数据集适合一个向量,它是否会有所帮助。即便如此,他似乎知道自己在做什么,所以我现在就闭嘴;)
标签: c++ multithreading vector