Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用线程对向量排序 是在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); }_C++_Multithreading_Vector - Fatal编程技术网

使用线程对向量排序 是在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); }

使用线程对向量排序 是在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); },c++,multithreading,vector,C++,Multithreading,Vector,我的问题是我们是否需要使用互斥锁锁定对数据列表的访问 注意:cmp函数是一个常规的整数比较函数。如果线程处理向量的不相交部分,则不应出现任何问题。只要线程处理的是不同的内存区域,并且比较函数仅处理该内存和局部变量,就应该可以了。本质上,您是通过在线程之间划分工作并只让线程处理其一半的数据来“锁定”表的每一半。对于各种算法的线程版本,您可以使用GCC的并行模式(如果使用GCC) 从技术上讲,标准规定这些类不是线程安全的,因此,如果您要从[]操作符之类的东西设置数据,那么从技术上讲,这是对一个对象的

我的问题是我们是否需要使用互斥锁锁定对数据列表的访问


注意:cmp函数是一个常规的整数比较函数。

如果线程处理向量的不相交部分,则不应出现任何问题。

只要线程处理的是不同的内存区域,并且比较函数仅处理该内存和局部变量,就应该可以了。本质上,您是通过在线程之间划分工作并只让线程处理其一半的数据来“锁定”表的每一半。

对于各种算法的线程版本,您可以使用GCC的并行模式(如果使用GCC)

从技术上讲,标准规定这些类不是线程安全的,因此,如果您要从[]操作符之类的东西设置数据,那么从技术上讲,这是对一个对象的多次写入。另一方面,在c数组的不同部分上操作是安全的……因此这里似乎存在冲突。如果你想非常干净,就把第一个元素的地址当作一个c数组。这里的很多答案都说,只要您位于阵列的不同部分,就可以了,尽管在许多实现中可能是这样


->我认为需要注意的是,实现是免费的,而不是安全的。

差不多,但不完全。这段代码通常不是线程安全的,即使假设实现对vector的线程安全做出了合理的保证

假设
Data\u List::value\u type
是您的体系结构不提供原子访问的类型。例如,在x86上,字节写入和对齐的字和双字写入是原子的,但短写入不是原子的,用户定义类型的写入也不是原子的,除非它们恰好大小和对齐良好。如果您的UDT尺寸为3,您可能会遇到问题

要执行非原子短写,实现可以执行两个字节的写操作。或者它可以加载单词,修改其中的两个字节,然后写回单词。在字节写入非常昂贵的体系结构上,后者是相当合理的

现在,假设您的实现执行了后者。进一步假设向量的除法恰好将单词的前半部分保留在一个部分,将单词的后半部分保留在另一个部分。最后假设两个不同的线程都试图同时修改该单词。这可能会出错-它们可能都读取相同的值,都对其进行了修改,但随后一次写回将先于另一次,因此其中一次修改将被覆盖并丢失

默认情况下,原子字节访问不是通用的,我怀疑任何实现在默认情况下都不会进行原子位访问。因此,即使其他向量类型是安全的,
向量
也是一个可能的问题:你对向量的划分可能会下降到一个字节的中间。并不是说您通常会以这种方式对布尔进行排序,而是在其他操作中,您可能会尝试分割向量,或者您的代码可能是泛型的

<>通常你可以认为Word访问是原子的(C或C++,int /Cudio> Access)。但是语言标准不能保证它,因此
sig\u atomic\u t
。你说你的
cmp
是一个int比较函数,这表明你的向量可能包含int。但是你可以使用int比较函数很好地比较短裤,所以我不知道


实际上,您需要做的是非常仔细地检查您的实现/平台,并查看它对从多个线程安全访问内存的说明。对于
int

的向量,这可能没什么问题。我想知道这是否真的能给你带来什么,当你完成每一半的排序后,列表仍然没有排序。您仍然需要对这两部分进行排序/合并together@John:我正在使用线程实现一个示例排序,然后使用递归加倍将两半合并在一起进行排序。。。我想知道我是否可以只使用偏移量,在相同的数据结构上工作,而不需要创建额外的副本和单独处理副本……好的,我同意所有其他答案——只要在排序过程中不改变向量中元素的数量就可以了。@John-分而治之是并行化背后的原则之一。当然,只要数据集足够大,它就会买东西。@Tom:如果排序占用了内存带宽(简单的整数比较表明会这样),那么将每个元素移动两次只会让事情变得更糟,而不是更好。对于内存溢出的排序,它可以看出这会有什么帮助,但我怀疑如果整个数据集适合向量,它是否会有帮助。即便如此,他似乎知道自己在做什么,所以我现在就闭嘴;)“只让线程处理其一半的数据”。除非您的体系结构执行RMW写入,并且向量的分区跨越单词边界。然后两个线程正在访问相同的内存。@Steve Jessop--我假设编译器会将任何用户定义的类型填充到单词边界,但是对于小于机器单词大小的类型,您当然需要更加小心。@Steve:thnx。。真的很感激。。。我决定将每个偏移量复制到单独的存储桶中,并对它们进行单独排序。我把这个问题和Strtok(Strtok_r的需求)进行了比较。所以我想知道如果我们不引入静态变量,迭代器是否会被两个线程损坏。。在实现之后,它似乎没有被破坏。。。所以我很好。。至于排序部分。。。我需要测试一下!!