目的
C++ REST SDK
中的PPLX
提供了基于任务的异步编程方案,基于PPLX
又提供了异步流,用来将输入输出转换为异步操作,其内容包括:
- STL容器异步流
- 文件异步流
- 原始内存异步流
- 生产者消费者异步流
- 标准输入输出异步流
以下将了解各种流的目的和使用方法。
异步流基础
了解标准流的都知道,流包含两部分:流缓冲、流接口,在C++ REST SDK
中其基础实现对应为:
- 流缓冲:
astreambuf.h
定义了流操作内容,STL容器异步流、原始内容异步流等都有对应的实现。 - 流接口:
streams.h
定义了输入流、输出流、输入输出流的操作接口,后续的异步流定义都派生于此。
异步流的命名空间在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());
生产者消费者流缓冲同时支持写入或者读取字节内容,一个生产者消费者流缓冲对可以在不同线程通过缓冲通信。
标准输入输出异步流
在一些场景下,需要对进行标准输入输出流和异步流之间互相对接,标准输入输出异步流就起到这样的作用。
譬如将异步流转换为标准流:
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
提供了这几种异步流来进行数据流操作,异步化了HTTP等通信时的流操作;即使不是用于云通信,也可以使用来异步化应用程序相关操作。