Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.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++ 用于循环回推的多线程C++;_C++_Multithreading - Fatal编程技术网

C++ 用于循环回推的多线程C++;

C++ 用于循环回推的多线程C++;,c++,multithreading,C++,Multithreading,我需要测试一些排序算法,快速排序,堆。。。只有2秒左右,但其他像BubbleSort这样的程序非常耗时(300k大约需要45分钟)。CPU的制冷率仅为20%。因此,我考虑使用多线程来改进多测试用例和大小的运行时。 伪代码(来自多个较小的函数): 我想在顺序不重要的循环上运行多线程。但是,std::vector::push_back不是线程安全的。所以我想我必须使用std::mutex(我不知道如何在循环中使用)。另外,我读到std::thread没有返回值,因此需要std::future,VS中

我需要测试一些排序算法,快速排序,堆。。。只有2秒左右,但其他像BubbleSort这样的程序非常耗时(300k大约需要45分钟)。CPU的制冷率仅为20%。因此,我考虑使用多线程来改进多测试用例和大小的运行时。
伪代码(来自多个较小的函数):

我想在顺序不重要的循环上运行多线程。但是,
std::vector::push_back
不是线程安全的。所以我想我必须使用std::mutex(我不知道如何在循环中使用)。另外,我读到
std::thread
没有返回值,因此需要
std::future
,VS中也有
parallel_用于
。这对我来说太难了,我不知道从哪里开始。请帮助我在代码中实现多线程

更新1 我试过:

std::for_each(std::execution::par, v.begin(), v.end(), [](auto &n) {
    n = benchmark(sort);
});
但显然g++和VS2019不支持它

但是,std::vector::push_back不是线程安全的

当线程读/写不同的元素并且没有线程导致向量的重新分配时,您不需要同步

不要使用
向后推
,而是先调整向量的大小:

v.resize( number_of_elements );
然后确保没有两个线程访问同一索引中的元素

PS:如果您的应用程序只使用了20%的CPU,那么您的应用程序的性能很可能不受CPU的限制,并且我不希望通过使用多个线程来获得太多的改进

但是,std::vector::push_back不是线程安全的

当线程读/写不同的元素并且没有线程导致向量的重新分配时,您不需要同步

不要使用
向后推
,而是先调整向量的大小:

v.resize( number_of_elements );
然后确保没有两个线程访问同一索引中的元素


PS:如果你的应用程序只使用了20%的CPU,那么你的应用程序的性能很可能不受CPU的限制,我也不希望通过使用多线程来获得太多的改进。

关于PS,我想我首先误解了你的代码。如果你想并行运行许多基准测试,那么我希望会有一些改进,但它可能会完全扭曲你的度量。这只是对主赋值排序算法的比较,所以我认为不管扭曲与否,BubbleSort永远都比不上QuickSort。我只是想尝试多线程for循环,只是想不出如何实现一个。@Phineas无论是否赋值,都不应该并行运行基准测试,因为结果可能几乎毫无意义。然而,我的回答适用于任何您使用它的目的。@Phineas关于您的更新,您应该解释是什么让您认为gcc和MSCV不“支持”它。这是什么意思?当您遇到编译器错误时,您需要包含它们。但是,请考虑你原来的问题已经有了答案,所以改变这个问题去问别的东西是不好的。考虑打开一个新的问题(包括一个和错误消息)GCC直达UnDebug <代码> >包含< /代码>,而我的VS不具有执行参数,即使<>代码>包含< /代码>是被识别的(并且是,已经“代码>”包含< /代码>)。你的回答肯定很有帮助,我试图在更新1中使用它来解决我的问题。关于PS,我想我首先误解了你的代码。如果你想并行运行许多基准测试,那么我希望会有一些改进,但它可能会完全扭曲你的度量。这只是对主赋值排序算法的比较,所以我认为不管扭曲与否,BubbleSort永远都比不上QuickSort。我只是想尝试多线程for循环,只是想不出如何实现一个。@Phineas无论是否赋值,都不应该并行运行基准测试,因为结果可能几乎毫无意义。然而,我的回答适用于任何您使用它的目的。@Phineas关于您的更新,您应该解释是什么让您认为gcc和MSCV不“支持”它。这是什么意思?当您遇到编译器错误时,您需要包含它们。但是,请考虑你原来的问题已经有了答案,所以改变这个问题去问别的东西是不好的。考虑打开一个新的问题(包括一个和错误消息)GCC直达UnDebug <代码> >包含< /代码>,而我的VS不具有执行参数,即使<>代码>包含< /代码>是被识别的(并且是,已经“代码>”包含< /代码>)。你的答案肯定很有帮助,我在更新1中尝试使用它来解决我的问题。