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