欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

【并發(fā)編程十一】c++線程同步——future-創(chuàng)新互聯(lián)

【并發(fā)編程十一】c++線程同步——future
  • 一、互斥
  • 二、條件變量
  • 三、future
    • 1、promise
      • 1.1、子線程設值,主線程獲取
      • 1.2、主線程設置值,子線程獲取
    • 2、async
      • 2.1、不開新線程的async
      • 2.2、開新線程的async
    • 3、packaged_task
      • 3.1、不使用bind
      • 3.2、提前指定參數(shù)
      • 3.3、bind
    • 4、shared_future
  • 四、信號量

簡介:
本篇文章,我們詳細的介紹下c++標準庫提供的線程同步方法中的第3個——future。

為青羊等地區(qū)用戶提供了全套網(wǎng)頁設計制作服務,及青羊網(wǎng)站建設行業(yè)解決方案。主營業(yè)務為網(wǎng)站設計、做網(wǎng)站、青羊網(wǎng)站設計,以傳統(tǒng)方式定制建設網(wǎng)站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!一、互斥

參見【并發(fā)編程九】c++線程同步——互斥(mutex)

二、條件變量

參見【并發(fā)編程十】c++線程同步——條件變量(condition_variable)

三、future

類模板 std::future 提供訪問異步操作結(jié)果的機制:

  • (通過std::asyncstd::packaged_taskstd::promise創(chuàng)建的)異步操作能提供一個 std::future 對象給該異步操作的創(chuàng)建者。
  • 然后,異步操作的創(chuàng)建者能用各種方法查詢、等待或從 std::future 提取值。若異步操作仍未提供值,則這些方法可能阻塞。
  • 異步操作準備好發(fā)送結(jié)果給創(chuàng)建者時,它能通過修改鏈接到創(chuàng)建者的 std::future 的共享狀態(tài)(例如 std::promise::set_value )進行。

注意, std::future 所引用的共享狀態(tài)不與另一異步返回對象共享(與 std::shared_future 相反)。

在這里插入圖片描述

1、promise
  • 類模板 std::promise 提供存儲值或異常的設施,之后通過 std::promise 對象所創(chuàng)建的 std::future 對象異步獲得結(jié)果。注意 std::promise 只應當使用一次。

備注:簡單來說,就是以下過程

  • 1、把promis和future綁定。
  • 2、promise設置值后,
  • 3、future等待,直到獲取值。
1.1、子線程設值,主線程獲取
  • demo
#include#include#includeusing namespace std;

void task(int a, int b, promise& p)
{p.set_value(a + b);
}
int main()
{// 把promise和future做關聯(lián)
    promisep;
    futuref=p.get_future();

    thread task1(task,1,2,ref(p));

    //do somesthing

    //get promise value
    f.wait();
    cout<< "return value is "<< f.get()<< '\n';//只能get一次。

    task1.join();
}
  • 輸出

在這里插入圖片描述

1.2、主線程設置值,子線程獲取
  • demo
#include#include#includeusing namespace std;

void task(int a, future& b, promise& p)
{p.set_value(a + b.get());
}
int main()
{// 把promise和future做關聯(lián)
    promisep_ret;
    futuref_ret=p_ret.get_future();

    promisep_in;
    futuref_in = p_in.get_future();

    thread task1(task,1,ref(f_in),ref(p_ret));

    //do somesthing
    //...
    p_in.set_value(3);

    //get promise value
    f_ret.wait();
    cout<< "return value is "<< f_ret.get()<< '\n';//只能get一次。

    task1.join();
}
  • 輸出

在這里插入圖片描述

2、async

異步運行一個函數(shù)(有可能在新線程中執(zhí)行),并返回保有其結(jié)果的 std::future.

2.1、不開新線程的async
  • demo
#include#include#includeusing namespace std;

int task(int a, int b)
{return a + b;
}


int main()
{// 把async和future做關聯(lián)
    futuref = async(task, 1, 5);

    //get future value
    f.wait();
    cout<< "return value is "<< f.get()<< '\n';
}
  • 輸出

在這里插入圖片描述

2.2、開新線程的async
  • launch::async意思是創(chuàng)建新的線程。
  • launch::deferred和不傳默認參數(shù)是一樣的,相當于延時調(diào)用。
#include#include#includeusing namespace std;

int task(int a, int b)
{return a + b;
}


int main()
{// 把async和future做關聯(lián)
    futuref = async(launch::async,task, 1, 5);

    //get future value
    f.wait();
    cout<< "return value is "<< f.get()<< '\n';
}

輸出結(jié)果和不開線程一樣的

3、packaged_task
  • 打包一個函數(shù),存儲其返回值以進行異步獲取
3.1、不使用bind
  • demo
#include#include#includeusing namespace std;

int task(int a, int b)
{return a + b;
}

int main()
{// 調(diào)用packaged_task的構(gòu)造函數(shù),返回值和兩個參數(shù)都是int類型,
    packaged_taskt(task);
    //執(zhí)行
    t(5,5);

    // 把packaged_task和future做關聯(lián)
    futuref = t.get_future();

    //獲取返回值的結(jié)果
    f.wait();
    cout<< "return value is "<< f.get()<< '\n';
}

輸出

在這里插入圖片描述

3.2、提前指定參數(shù)
#include#include#includeusing namespace std;

int task(int a, int b)
{return a + b;
}

int main()
{// 調(diào)用packaged_task的構(gòu)造函數(shù),返回值和兩個參數(shù)都是int類型,
    packaged_taskt(std::bind(task,11,12));
    //執(zhí)行
    t();

    // 把packaged_task和future做關聯(lián)
    futureresult = t.get_future();

    //獲取返回值的結(jié)果
    result.wait();
    cout<< "return value is "<< result.get()<< '\n';
}
  • 輸出

在這里插入圖片描述

3.3、bind

bind返回參數(shù)為std::function

  • demo
#include#include#includeusing namespace std;

int task(int a, int b)
{return a + b;
}

int main()
{// bind返回值為std::function,
    auto a = bind(task, 11, 14);
    //執(zhí)行
    int result = a();

    cout<< "return value is "<< result<< '\n';
}
  • 輸出

在這里插入圖片描述

備注:既然bind就可以獲取結(jié)果,為何還要用packaged_task,當然是因為future啊。

4、shared_future
  • future只能get一次,那如果我們想用使用多次的get呢?———答:使用shared_future。
  • 網(wǎng)上的例子基本都是shared_future和async放在一起使用。
  • 網(wǎng)上并沒有shared_future和promise一起使用的例子,所以我們寫下后者的例子demo.
#include#include#includeusing namespace std;

mutex mtx;

void task(int a, shared_future& b, promise& p)
{p.set_value(2);
    b.wait();
    int bb = b.get();
    lock_guardguard(mtx);
    cout<< "task b ="<< b.get()<// 把promise和future做關聯(lián)
    promisep_ret_1,p_ret_2;

    futuref1 = p_ret_1.get_future();
    futuref2 = p_ret_2.get_future();

    promisep_in;
    shared_futures_f = p_in.get_future();

    thread task1(task, 1, ref(s_f), ref(p_ret_1));
    thread task2(task, 2, ref(s_f), ref(p_ret_2));

    //do somesthing
    f1.wait();
    f2.wait();
    //...
    p_in.set_value(3);

    //get promise value
    {lock_guardguard(mtx);
        cout<< "main() return value is "<< f1.get()<< '\n';//只能get一次。
        cout<< "main() return value is "<< f2.get()<< '\n';//只能get一次。
    }

    task1.join();
    task2.join();
}
  • 輸出

在這里插入圖片描述

參考:
1、https://www.apiref.com/cpp-zh/cpp/thread.html
2、https://en.cppreference.com/w/cpp/thread
3、書籍《c++服務器開發(fā)精髓》——張遠龍

四、信號量
  • 參見【并發(fā)編程十二】c++20線程同步——信號量(semaphore)

你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

文章題目:【并發(fā)編程十一】c++線程同步——future-創(chuàng)新互聯(lián)
網(wǎng)頁鏈接:http://aaarwkj.com/article26/cogdjg.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設計公司靜態(tài)網(wǎng)站、網(wǎng)站改版、微信小程序、關鍵詞優(yōu)化、品牌網(wǎng)站建設

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司
欧美成人精品视频在线不卡| 激情婷婷亚洲五月综合网| 国产中文字幕一区久久| 日韩永久免费av网站| 国产精品成人亚洲一区二区| 欧美精品日韩精品一区二区| 亚洲欧美另类不卡专区| 国产大神91一区二区三区| 在线最新亚洲日本韩国| 国产精品国产精品国产| 国产精品一区欧美精品| 精精国产xxxx视频在线不卡| 成人免费在线视频不卡| 亚洲综合中文字幕经典av在线 | 开裆丝袜高跟啪啪高潮av| 日韩精品在线观看一| 国产精品一区二区三区在线| 日本中文字幕三级专区| 情五月激情亚洲丁香佳色| 自拍偷拍一区蜜桃视频| 欧美一区二区三区高清正版| 内射小美女阴户毛片在线| 日本一级a级黄免视频| 白白色最新福利在线视频观看| 夫妻性生活免费看视频| 日韩免费系列一区二区| 日韩精品中文字幕欧美乱| 久久精品国产视频在热| 日本大片在线一区二区三区| 国产亚洲av一区二区三区| 国产91人妻精品一区二区三区| 线上免费看黄色亚洲片| 亚洲欧美另类熟女丝袜| 插入内射视频在线观看| 一区二区三区四区蜜桃av| 欧美午夜国产在线观看| 欧美一区二区三区va| 中文字幕亚洲精品熟女少妇| 五月婷婷六月丁香伊人妞| 国产三级无遮挡在线观看| 国产欧美一区二区三区久久|