美文网首页
C++ REST SDK中的异步流

C++ REST SDK中的异步流

作者: 长不胖的Garfield | 来源:发表于2016-12-30 17:16 被阅读0次

    目的

    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等通信时的流操作;即使不是用于云通信,也可以使用来异步化应用程序相关操作。

    相关文章

      网友评论

          本文标题:C++ REST SDK中的异步流

          本文链接:https://www.haomeiwen.com/subject/fwbmvttx.html