在C ++中对向量的子部分进行排序

时间:2015-04-21 23:22:50

标签: c++ multithreading boost

我有一个类型的无符号变量向量:

vector<unsigned> a;
a.push_back(5); a.push_back(3); a.push_back(2); a.push_back(1);
a.push_back(12); a.push_back(4); a.push_back(20); a.push_back(11);
a.push_back(13); a.push_back(7); a.push_back(23); a.push_back(21);

现在我想创建3个线程,以便每个线程对向量中的4个值进行排序。例如。

Thread 1: a[0],a[1],a[2],a[3]. After sorting their values become: 1,2,3,5
Thread 2: a[4],a[5],a[6],a[7]. After sorting their values become: 4,11,12,20
Thread 3: a[8],a[9],a[10],a[11]. After sorting their values become: 7,13,21,23

在所有线程完成排序后,我打算通知值现在已经排序。是否可以使用pthread在c ++中执行相同操作,如果是,那么如何。我正在使用gcc 4.4。我知道可以按顺序执行相同的操作,但我很想知道是否可以以多线程方式对这些线程进行排序?

编辑:我不能使用std :: async,因为我正在使用gcc 4.4版。我试图将这个逻辑包含在c ++ 11之前编码的旧代码中。因此,我不能使用c ++ 11。

1 个答案:

答案 0 :(得分:1)

排序算法std::sort用于迭代器。它需要两个迭代器,比如beginend,并对半开放范围[begin, end)中的元素进行排序。

因此,我们可以尝试将此问题分解。

thread 0: sort(a, a+4);
thread 1: sort(a+4, a+8);
thread 2: sort(a+8, a+12);

现在,关于线程的工作分配和等待完成,我们可以尝试std::async。如果C ++ 11不是一个选项(如注释中所述),那么您可以创建一个线程池解决方案,例如参见How to create a thread pool using boost in C++?