Linux下C++ 多線程編程(std::future)

future頭文件

future頭文件提供了這樣一種便利,允許異步訪問一個(gè)被一個(gè)特定的提供者設(shè)置的值,提供者和訪問者可以在不同的線程,它會(huì)保證不同線程之間的同步。
訪問者可以通過提供者(比如說promise)提供的future對(duì)象來訪問共享狀態(tài)(值)。
<future>頭文件包含了以下幾個(gè)類和函數(shù)

  • Provider類:std::promise, std::package_task
  • Future類 : std::future, shared_future
  • Provider函數(shù):std::async()
  • 其他

std::future

future對(duì)象可以從其他一些提供者對(duì)象或者函數(shù)獲取一個(gè)值。
合法(valid)的futures是一些關(guān)聯(lián)了共享狀態(tài)的future對(duì)象,可以通過如下函數(shù)來獲取。

  • async
  • promise::get_future
  • packaged_task::get_future

記住只有合法的future對(duì)象才是有用的,使用默認(rèn)構(gòu)造函數(shù)創(chuàng)建的future對(duì)象不是合法的(除非通過轉(zhuǎn)移賦值的方式把一個(gè)合法的future對(duì)象賦值給它了),也就是說直接定義的future對(duì)象沒有用。
一個(gè)合法的future對(duì)象的future::get函數(shù)會(huì)block線程,等待提供者吧共享狀態(tài)置成ready。

共享狀態(tài)的生命周期會(huì)一直延續(xù)到和它相關(guān)的最后一個(gè)對(duì)象被釋放或者銷毀了為止。

std::promise

promise是一個(gè)模板類,下面是它的三個(gè)聲明

template <class T> promise;
template <class R&> promise<R&>;    //T是引用類型
template <> promise<void>    // T 是一個(gè)void類型

promise這個(gè)對(duì)象保存了一個(gè)類型為T的值,這個(gè)值可以通過future對(duì)象來獲取(這個(gè)獲取的過程可能在另一個(gè)線程中發(fā)生),這個(gè)類提供了一種同步機(jī)制。

#include <iostream>
#include <functional>   //std::ref
#include <thread>
#include <future>

void print_int(std::future<int>& fut)
{
    int x = fut.get();    // 如果共享狀態(tài)沒有ready,線程會(huì)阻塞在這里,知道監(jiān)測(cè)到狀態(tài)ready了
    std::cout << "value: " << x << std::endl;
}

int main()
{
    std::promise<int> prom;
    
    std::future<int> fut = prom.get_future();  // 返回的future對(duì)象和promise對(duì)象共享狀態(tài)相關(guān)聯(lián)
    std::thread th1 (print_int, std::ref(fut));   // 通過引用的方式傳遞future對(duì)象給新創(chuàng)建的線程
    prom.set_value(10);      // set_value設(shè)置共享狀態(tài),并且promise的共享狀態(tài)標(biāo)志變成ready
    
    th1.join();
    
    return 0;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容