目的
C++ REST SDK
中的PPLX
提供了基于任務的異步編程方案,基于PPLX
又提供了異步流,用來將輸入輸出轉換為異步操作,其內容包括:
- STL容器異步流
- 文件異步流
- 原始內存異步流
- 生產者消費者異步流
- 標準輸入輸出異步流
以下將了解各種流的目的和使用方法。
異步流基礎
了解標準流的都知道,流包含兩部分:流緩沖、流接口,在C++ REST SDK
中其基礎實現(xiàn)對應為:
- 流緩沖:
astreambuf.h
定義了流操作內容,STL容器異步流、原始內容異步流等都有對應的實現(xiàn)。 - 流接口:
streams.h
定義了輸入流、輸出流、輸入輸出流的操作接口,后續(xù)的異步流定義都派生于此。
異步流的命名空間在Concurrency::streams
,使用時為concurrency::streams
。
STL容器異步流
定義在containerstream.h
中,對應的流緩沖類型為container_buffer
,流定類型為container_stream
,同時支持寫入和讀取。
使用示例如下:
//寫入字符串到流
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)
{
//寫入后處理
});
concurrency::streams::container_buffer<std::string> inStringBuffer;
inStream.read_line(inStringBuffer).then([inStringBuffer](std::size_t bytesRead) {
const auto& strLine = inStringBuffer.collection();
//讀取到后處理
});
作為輸出時,作為入參構造相應的buffer
,就可以傳遞給異步輸出流使用;作為輸入時,只需要構造出該類型的buffer
,接收輸入,即可從中取出STL容器及對應的內容。
文件異步流
文件異步流定義在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) {
//處理輸出流
});
原始內存異步流
定義在rawptrstream.h
中,對應的流緩沖類型為rawptr_buffer
,流類型為rawptr_stream
,同時支持寫入和讀取,大小是確定的。使用示例如下:
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;
//寫入后處理
});
生產者消費者異步流
定義在producerconsumerstream.h
,對應的流緩沖類型為producer_consumer_buffer
,使用示例如下:
concurrency::streams::producer_consumer_buffer<uint8_t> oBuffer;
ReadWriteStream(oBuffer.create_istream(), oBuffer.create_ostream());
生產者消費者流緩沖同時支持寫入或者讀取字節(jié)內容,一個生產者消費者流緩沖對可以在不同線程通過緩沖通信。
標準輸入輸出異步流
在一些場景下,需要對進行標準輸入輸出流和異步流之間互相對接,標準輸入輸出異步流就起到這樣的作用。
譬如將異步流轉換為標準流:
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;
將標準流轉換為異步流:
std::stringstream stream;
stream << "abcdefghijklmnopqrstuvwxyz";
concurrency::streams::stdio_istream<char> astream(stream); concurrency::streams::container_buffer<std::string> buffer; astream.read_line(buffer).wait();
總結
C++ REST SDK
提供了這幾種異步流來進行數(shù)據流操作,異步化了HTTP等通信時的流操作;即使不是用于云通信,也可以使用來異步化應用程序相關操作。