【C++併發與多線程】 11_std::atomic敘談、std::launch(std::async) 深刻

std::atomic 敘談

  • 原子類模板徹底專用於基本整數類型(bool除外),以及 <cstdint> 中 typef 所需的任何擴展整數類型。

專用的基本數據類型:ios

char
signed char
unsigned char
short
unsigned short
int
unsigned int
long
unsigned long
long long
unsigned long long
char16_t
char32_t
wchar_t
extended integral types (if any)

附加的成員函數:segmentfault

atomic::fetch_add
atomic::fetch_sub
atomic::fetch_and
atomic::fetch_or
atomic::fetch_xor
atomic::operator++
atomic::operator--
operator (comp. assign.)
  • 對於 bool 實例化,僅支持常規原子操做。請注意,大多數 c-style 原子類型都是這些專門化的別名(或這些專門化繼承的基類的別名)

原子操做還部分專用於指針類型,具備一下附加成員函數:異步

atomic::fetch_add
atomic::fetch_sub
atomic::operator++
atomic::operator--
operator (comp. assign.)

std::launch(std::async) 深刻理解

std::asyncasync

enum class launch : /* unspecified */ {
    async =    /* unspecified */,
    deferred = /* unspecified */,
    /* implementation-defined */
};
  • 此枚舉類型用於定義 aync 異步調用中的啓動策略。

launch::async

  • 入口函數由新線程異步調用,並將其返回其與共享狀態的訪問點同步。
#include <iostream>
#include <future>
#include <thread>

using namespace std;

bool async_func () {

    cout << "async_func begin " << std::this_thread::get_id() << endl;

    cout << "async_func end" << endl;

    return true;
}

int main ()
{
  cout << "main begin " << std::this_thread::get_id() << endl;

  std::future<bool> fut = std::async (launch::async, async_func);   // 建立新線程並調用線程入口函數

  cout << fut.get() << endl;

  cout << "main end" << endl;

  return 0;
}

輸出:函數

main begin 1
async_func begin 2
async_func end
1
main end

launch::deferred

  • 入口函數延遲調用。
  • 在調用線程訪問 future 對象的 wait, get 函數時,入口函數才被調用。
  • 同時未建立新線程,入口函數在 future 對象被調用的線程中執行。
#include <iostream>
#include <future>
#include <thread>

using namespace std;

bool async_func () {

    cout << "async_func begin " << std::this_thread::get_id() << endl;

    cout << "async_func end" << endl;

    return true;
}

int main ()
{
  cout << "main begin " << std::this_thread::get_id() << endl;

  std::future<bool> fut = std::async (launch::deferred, async_func);

  if (fut.wait_for(std::chrono::microseconds(0)) == std::future_status::deferred)   // 檢查是不是 launch::deferred 
  {
    cout << "std::future_status::deferred" << endl;
  }

  cout << fut.get() << endl;    // 入口函數被調用

  cout << "main end" << endl;

  return 0;
}

輸出:[注意兩處打印的線程id]fetch

main begin 1
std::future_status::deferred
async_func begin 1
async_func end
1
main end

launch::async | launch::deferred

  • 依據系統和庫的實現,自動選擇啓動策略。
  • 準則主要爲是否有足夠的系統資源建立線程
  • 這也是未明確指定參數時的默認實現。
std::future<bool> fut = std::async (launch::async|launch::deferred, async_func);

==

std::future<bool> fut = std::async (async_func);
相關文章
相關標籤/搜索