stdfuture 和 stdasync
在以下天真并行合并排序示例中,std::async
用于启动多个并行 merge_sort 任务。std::future
用于等待结果并同步它们:
#include <iostream>
using namespace std;
void merge(int low,int mid,int high, vector<int>&num)
{
vector<int> copy(num.size());
int h,i,j,k;
h=low;
i=low;
j=mid+1;
while((h<=mid)&&(j<=high))
{
if(num[h]<=num[j])
{
copy[i]=num[h];
h++;
}
else
{
copy[i]=num[j];
j++;
}
i++;
}
if(h>mid)
{
for(k=j;k<=high;k++)
{
copy[i]=num[k];
i++;
}
}
else
{
for(k=h;k<=mid;k++)
{
copy[i]=num[k];
i++;
}
}
for(k=low;k<=high;k++)
swap(num[k],copy[k]);
}
void merge_sort(int low,int high,vector<int>& num)
{
int mid;
if(low<high)
{
mid = low + (high-low)/2;
auto future1 = std::async(std::launch::deferred,[&]()
{
merge_sort(low,mid,num);
});
auto future2 = std::async(std::launch::deferred, [&]()
{
merge_sort(mid+1,high,num) ;
});
future1.get();
future2.get();
merge(low,mid,high,num);
}
}
注意:在示例中,std::async
是使用策略 std::launch_deferred
启动的。这是为了避免在每次调用中创建新线程。在我们的示例中,对 std::async
的调用是按顺序进行的,它们在调用 std::future::get()
时同步。
std::launch_async
强制在每次调用中创建一个新线程。
默认策略是 std::launch::deferred| std::launch::async
,这意味着实现确定了创建新线程的策略。