Parallel Pattern Library(PPL)学习笔记
2019-01-01 23:15:58来源:博客园 阅读 ()
关于PPL是什么,可以搜索关键字MSDN PPL了解详情。这里谈一下困扰自己好一阵子的一个地方--task chain中抛出异常的处理,一来可为其他码农同行参考,二来给自己做个记录,以免日后忘却。
Value-based continuation的成功尝试
void testValueBasedContinuation() { concurrency::task<void> task1([] { throw std::exception("Hello"); }); //set a breakpoint here, and see the wcout IS executed auto task2 = task1.then([]() { std::cout << "continuation" << std::endl; }); try { task2.wait(); } catch (std::exception& e) { std::cout << "exception" << std::endl; } }
这里的要点在于,value-based continuation中continuation task的执行一定是在previous task执行完成之后,因此将continuation task用try catch(T-C)保护起来即可。(个人猜测,value-based chain会在同一个线程中执行)
错误的写法包括:
- 直接将task1的声明用try catch保护起来
- 直接将auto task2一句用try catch保护起来
原因是,声明处并不是task的真正执行的地方,保护起来并没有作用
导致PPL库抛出如下异常
~_ExceptionHolder() { if (_M_exceptionObserved == 0) { // If you are trapped here, it means an exception thrown in task chain didn't get handled. // Please add task-based continuation to handle all exceptions coming from tasks. // this->_M_stackTrace keeps the creation callstack of the task generates this exception. _REPORT_PPLTASK_UNOBSERVED_EXCEPTION(); } }
Task-based continuation的成功尝试
void testTaskBasedContinuation() { concurrency::task<void> task1([] { throw std::exception("Hello"); }); auto task2 = task1.then([](concurrency::task<void>& previous) { previous.get(); std::cout << "continuation" << std::endl; }); try { task2.wait(); } catch (std::exception& e) { std::cout << "exception" << std::endl; } }
这里的关键是previous.get()那一行,保证代码会在那里抛出异常(而不是其他的线程,个人猜测).
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:最短点对
- 看看Parallel中高度封装的三个方法,Invoke,For和ForEach 2018-06-18
- .NET 基于任务的异步模式(Task-based Asynchronous Pattern 2018-06-18
- .NET 服务器定位模式(Service Locator Pattern)&mdash 2018-06-18
- Task Parallel Library01,基本用法 2018-06-18
- Event-based Asynchronous Pattern Overview基于事件的异步 2018-06-18
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash