C++ 同时标记化和解析

C++ 同时标记化和解析,c++,parsing,visual-c++,c++17,ppl,C++,Parsing,Visual C++,C++17,Ppl,考虑到新的c++17标准正在为并发性带来更多的灵活性,特别是std::feature和Task。我想知道我是否可以使用“任务”(我正在使用MicrosoftImplementation,ppl)来进行某种并发解析和标记化(也包括从文件异步读取)。我遵循的模型与前面讨论的异步读/写模式类似(不使用create_iterative_task实用程序) Concurrency::TaskBuildParseTree(解析器p,标记器t) { 返回t.asyncEmit() .then([&p](令牌令

考虑到新的c++17标准正在为并发性带来更多的灵活性,特别是std::feature和Task。我想知道我是否可以使用“任务”(我正在使用MicrosoftImplementation,ppl)来进行某种并发解析和标记化(也包括从文件异步读取)。我遵循的模型与前面讨论的异步读/写模式类似(不使用create_iterative_task实用程序)

Concurrency::TaskBuildParseTree(解析器p,标记器t)
{
返回t.asyncEmit()
.then([&p](令牌令牌){返回p.asyncParse(令牌);})
.然后([&t,&p](){
如果(t.done()==true){
从_结果()返回并发::任务_;
}
否则{
返回树((p),(t));
}
});
}
将其用作:

Concurrency::task<void> ts = buildParseTree(p, t);
ts.get();
Concurrency::task ts=buildParseTree(p,t);
t.get();
当我们执行
get
时,它实际上会触发其余的任务,并且解析器中的解析树是以增量方式构建的。。一旦
get
返回,我们应该拥有解析树(以防解析成功)

  • 在读取文件、标记和解析大型文件时,此模型是否有意义
  • 我是否正确使用了“infra”?使用
    &&
    语义是否更有意义?从本质上讲,如何向用户公开此API。这段代码的代码检查将非常好。。我知道它不是完整的代码,但只是这段语法和语义

可以工作,但您应该调查开销。对于某些任务/未来库,
.then()
将在特定的调度程序甚至另一个线程上安排一个继续。如果您对已解析的每个令牌执行此操作,将产生相当大的开销。可能会起作用,但您应该调查开销。对于某些任务/未来库,
.then()
将在特定的调度程序甚至另一个线程上安排一个继续。如果您对已解析的每个令牌执行此操作,则会产生相当大的开销。
Concurrency::task<void> ts = buildParseTree(p, t);
ts.get();