我一直在尝试使用线程优化排序算法(quicksort)。我知道它在std :: sort()实现中已经相当不错了,但是我试图通过计算机上的优化来击败它,并同时了解线程。
所以,我的问题是,如何在递归快速排序函数中使用线程?
这里的功能(删除了不重要的问题):
template <typename T>
void quicksort(T arr[], const int &size, const int &beginning, const int &end)
{
// Algorithm here
thread t1(quicksort, arr, size, beginning, slow - 1);
thread t2(quicksort, arr, size, slow + 1, end);
}
如果我错了,你最终需要更多代码,请告诉我,我会更新它。
我使用的是Visual Studio 2012,截至目前,该错误指出:
error C2661: 'std::thread::thread' : no overloaded function takes 5 arguments
我也试过在每个参数上调用ref(arr)等,但是我得到了同样的错误。
编辑: 在通过@mfontanini尝试解决方案后,我可以编译没有错误,但在运行时,我得到:
Debug Error!
Program: ...sktop\VisualStudio\Projects\SpeedTester\Debug\SpeedTester.exe
R6010
- abort() has been called
(Press Retry to debug the application)
重复一遍又一遍。最终,它以代码3退出。
答案 0 :(得分:2)
您需要明确指出哪个是T
模板参数:
thread t1(&quicksort<T>, arr, size, beginning, slow - 1);
否则编译器会看到您指的是函数模板,而不是指哪个特定的特化;它不能无处推断T
。
答案 1 :(得分:0)
您的主要问题可能是您需要join()
生成的thread
。如果线程对象在没有事先join()
或detach()
实施调用std::terminate()
的情况下被破坏。
您不需要detach()
,因为您需要知道所有部分排序都已完成才能完成整体排序,因此join
是正确的事情。
此外,还有一些事情可以改进:
int
。对于简单的标量类型,传递值更有效,并且从其他线程引用局部变量通常不是一个好主意(除非你有充分的理由和协议)join()
另一部分。)std::async
的默认启动策略,以避免启动比平台可以处理的更多线程。