目的
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)操作哮奇。