C++ REST SDK中的異步流

目的

C++ REST SDK中的PPLX提供了基于任務(wù)的異步編程方案,基于PPLX又提供了異步流,用來(lái)將輸入輸出轉(zhuǎn)換為異步操作,其內(nèi)容包括:

  • STL容器異步流
  • 文件異步流
  • 原始內(nèi)存異步流
  • 生產(chǎn)者消費(fèi)者異步流
  • 標(biāo)準(zhǔn)輸入輸出異步流

以下將了解各種流的目的和使用方法神郊。

異步流基礎(chǔ)

了解標(biāo)準(zhǔn)流的都知道,流包含兩部分:流緩沖趾唱、流接口涌乳,在C++ REST SDK中其基礎(chǔ)實(shí)現(xiàn)對(duì)應(yīng)為:

  • 流緩沖:astreambuf.h
    定義了流操作內(nèi)容,STL容器異步流甜癞、原始內(nèi)容異步流等都有對(duì)應(yīng)的實(shí)現(xiàn)夕晓。
  • 流接口:streams.h
    定義了輸入流、輸出流悠咱、輸入輸出流的操作接口蒸辆,后續(xù)的異步流定義都派生于此征炼。

異步流的命名空間在Concurrency::streams,使用時(shí)為concurrency::streams躬贡。

STL容器異步流

定義在containerstream.h中谆奥,對(duì)應(yīng)的流緩沖類型為container_buffer,流定類型為container_stream拂玻,同時(shí)支持寫(xiě)入和讀取酸些。
使用示例如下:

//寫(xiě)入字符串到流
std::string strData("test string to write\n");
concurrency::streams::container_buffer<std::string> outStringBuffer(std::move(strData));
outStream.write(outStringBuffer, outStringBuffer.collection().size()).then([](std::size_t bytesWritten)
{
 //寫(xiě)入后處理
});
 
 
concurrency::streams::container_buffer<std::string> inStringBuffer;
inStream.read_line(inStringBuffer).then([inStringBuffer](std::size_t bytesRead) {
 const auto& strLine =  inStringBuffer.collection();
 //讀取到后處理
});

作為輸出時(shí),作為入?yún)?gòu)造相應(yīng)的buffer檐蚜,就可以傳遞給異步輸出流使用魄懂;作為輸入時(shí),只需要構(gòu)造出該類型的buffer闯第,接收輸入市栗,即可從中取出STL容器及對(duì)應(yīng)的內(nèi)容。

文件異步流

文件異步流定義在filestream.h中乡括,緩沖類型為file_buffer肃廓,流類型為file_stream,使用示例如下:

concurrency::streams::fstream::open_istream(U("filename")).then(
    [](concurrency::streams::istream inStream) {
 //處理輸入流
});
 
concurrency::streams::fstream::open_ostream(U("filename")).then(
    [](concurrency::streams::ostream outStream) {
 //處理輸出流
});

原始內(nèi)存異步流

定義在rawptrstream.h中,對(duì)應(yīng)的流緩沖類型為rawptr_buffer诲泌,流類型為rawptr_stream,同時(shí)支持寫(xiě)入和讀取盲赊,大小是確定的。使用示例如下:

const std::size_t rawDataSize = 8;
unsigned char * rawData = new unsigned char[rawDataSize];
memcpy(&rawData[0], "raw data", rawDataSize);
concurrency::streams::rawptr_buffer<unsigned char> rawOutBuffer(rawData, rawDataSize, std::ios::in);
outStream.write(rawOutBuffer, rawDataSize).then([rawData](std::size_t bytesWritten) {
 delete[] rawData;
 //寫(xiě)入后處理
});

生產(chǎn)者消費(fèi)者異步流

定義在producerconsumerstream.h敷扫,對(duì)應(yīng)的流緩沖類型為producer_consumer_buffer哀蘑,使用示例如下:

concurrency::streams::producer_consumer_buffer<uint8_t> oBuffer;
ReadWriteStream(oBuffer.create_istream(), oBuffer.create_ostream());

生產(chǎn)者消費(fèi)者流緩沖同時(shí)支持寫(xiě)入或者讀取字節(jié)內(nèi)容,一個(gè)生產(chǎn)者消費(fèi)者流緩沖對(duì)可以在不同線程通過(guò)緩沖通信葵第。

標(biāo)準(zhǔn)輸入輸出異步流

在一些場(chǎng)景下绘迁,需要對(duì)進(jìn)行標(biāo)準(zhǔn)輸入輸出流和異步流之間互相對(duì)接,標(biāo)準(zhǔn)輸入輸出異步流就起到這樣的作用。
譬如將異步流轉(zhuǎn)換為標(biāo)準(zhǔn)流:

concurrency::streams::stringstreambuf strbuf;
concurrency::streams::basic_ostream<char> ss(strbuf.create_ostream());
std::basic_ostream<char> stream(concurrency::streams::async_ostream<char>(ss).rdbuf());
stream << "hello" << ", there, this is " << 4711;

將標(biāo)準(zhǔn)流轉(zhuǎn)換為異步流:

std::stringstream stream;
stream << "abcdefghijklmnopqrstuvwxyz"; 
concurrency::streams::stdio_istream<char> astream(stream); concurrency::streams::container_buffer<std::string> buffer; astream.read_line(buffer).wait();

總結(jié)

C++ REST SDK提供了這幾種異步流來(lái)進(jìn)行數(shù)據(jù)流操作卒密,異步化了HTTP等通信時(shí)的流操作缀台;即使不是用于云通信,也可以使用來(lái)異步化應(yīng)用程序相關(guān)操作哮奇。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末膛腐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鼎俘,更是在濱河造成了極大的恐慌哲身,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贸伐,死亡現(xiàn)場(chǎng)離奇詭異勘天,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)脯丝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)商膊,“玉大人,你說(shuō)我怎么就攤上這事巾钉∏逃” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵砰苍,是天一觀的道長(zhǎng)潦匈。 經(jīng)常有香客問(wèn)我,道長(zhǎng)赚导,這世上最難降的妖魔是什么茬缩? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮吼旧,結(jié)果婚禮上凰锡,老公的妹妹穿的比我還像新娘。我一直安慰自己圈暗,他們只是感情好掂为,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著员串,像睡著了一般勇哗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寸齐,一...
    開(kāi)封第一講書(shū)人閱讀 51,190評(píng)論 1 299
  • 那天欲诺,我揣著相機(jī)與錄音,去河邊找鬼渺鹦。 笑死扰法,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的毅厚。 我是一名探鬼主播塞颁,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼吸耿!你這毒婦竟也來(lái)了殴边?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤珍语,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后竖幔,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體板乙,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了募逞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛋铆。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖放接,靈堂內(nèi)的尸體忽然破棺而出刺啦,到底是詐尸還是另有隱情,我是刑警寧澤纠脾,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布玛瘸,位于F島的核電站,受9級(jí)特大地震影響苟蹈,放射性物質(zhì)發(fā)生泄漏糊渊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一慧脱、第九天 我趴在偏房一處隱蔽的房頂上張望渺绒。 院中可真熱鬧,春花似錦菱鸥、人聲如沸宗兼。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)殷绍。三九已至,卻和暖如春扳抽,著一層夾襖步出監(jiān)牢的瞬間篡帕,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工贸呢, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留镰烧,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓楞陷,卻偏偏與公主長(zhǎng)得像怔鳖,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子固蛾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

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

  • C/C++輸入輸出流總結(jié) 前兩天寫(xiě)C++實(shí)習(xí)作業(yè)结执,突然發(fā)現(xiàn)I/O是那么的陌生,打了好長(zhǎng)時(shí)間的文件都沒(méi)有打開(kāi)艾凯,今天終...
    LuckTime閱讀 1,729評(píng)論 0 6
  • 轉(zhuǎn)自http://blog.csdn.net/xugangwen/article/details/44811783...
    扎Zn了老Fe閱讀 12,720評(píng)論 1 142
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,077評(píng)論 25 707
  • 轉(zhuǎn)自 http://www.ibm.com/developerworks/cn/education/java/j-...
    抓兔子的貓閱讀 2,304評(píng)論 0 22
  • 實(shí)現(xiàn)安全管理體系一體化献幔,建立現(xiàn)代企業(yè)安全管理制度,形成一套科學(xué)趾诗、系統(tǒng)有效的安全管理運(yùn)作機(jī)制蜡感,獲得最佳安全績(jī)效蹬蚁,是航...
    brandnewme閱讀 2,242評(píng)論 0 0