C++Promise函數

來源:互聯網
上載者:User

標籤:

Promise內部會建立一個shared state是用來放一個相應的類型的值或是一個異常,並可被future object 取其資料當線程結果

promise是在形成成果後才將結果放進shared state中。所以不會發生讀和寫的並行作業

#include <thread>#include <future>#include <iostream>#include <string>#include <exception>#include <random>//隨機數類#include <chrono>//時間處理類#include <stdexcept>//標準異常類#include <functional>//STL 定義運算函數(代替運算子)#include <utility>//STL 通用模板類using namespace std;void toSomething(promise<string> &p){    try{        cout << "read char (‘x‘ for exception):";        //char c = cin.get();        char c;        default_random_engine dre(time(NULL));        uniform_int_distribution<int> id(0, 24);        c = ‘a‘ + id(dre);        //this_thread::sleep_for(chrono::milliseconds(5000));        if (c == ‘x‘)        {            throw runtime_error(string("char ") + " read");        }        string s = string("char ") + c + " processed";        //在主函數調用get()方法時線程會停滯(block)直到share state 成為ready-當promise的set_value()或set_exception()執行後便是如此,也不意味promise的線程已經結束;        //該線程可能仍執行著其他語句,甚至儲存其他結果放進其他promise內。        //如果想令shared state 線上程確實結束時變成ready-以確保線程的local object 及其他材料在釋放前清除線程你應該使用set_value_at_thread_exit() and set_exception_at_thread_exit(),防止泄露        p.set_value_at_thread_exit(move(s));    }    catch (const exception &e)    {        p.set_exception_at_thread_exit(current_exception());    }}int main(){    try{        promise<string>p;//線上程定義前定義一個promise object。promise內部會建立y一個shared state, 在這裡        //是用來放一個相應的類型的值或是一個異常,並可被future object 取其資料當線程結果        //這個promise隨後被傳給一個分離線程中啟動並執行任務(task):        thread t(toSomething, ref(p));//藉由ref() 確保promise以by reference(傳地址)方式傳遞,使其可以被改變。        t.detach();//將線程分離主線程,使其在後台運行        future<string> f(p.get_future());//定義一個用來取promise結果的future(),它與promise()是匹配的        cout << "result: " << f.get() << endl;//擷取線程的結果    }    catch (const exception &e)    {        cerr << "EXCEPTION:" << e.what() << endl;    }    system("pause");    return 0;}

 

C++Promise函數

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.