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
,這意味著實現確定了建立新執行緒的策略。