Visual C++本地并行编程中的状态管理_.docx

上传人:PIYPING 文档编号:11626635 上传时间:2021-08-26 格式:DOCX 页数:7 大小:14.24KB
返回 下载 相关 举报
Visual C++本地并行编程中的状态管理_.docx_第1页
第1页 / 共7页
Visual C++本地并行编程中的状态管理_.docx_第2页
第2页 / 共7页
Visual C++本地并行编程中的状态管理_.docx_第3页
第3页 / 共7页
Visual C++本地并行编程中的状态管理_.docx_第4页
第4页 / 共7页
Visual C++本地并行编程中的状态管理_.docx_第5页
第5页 / 共7页
亲,该文档总共7页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《Visual C++本地并行编程中的状态管理_.docx》由会员分享,可在线阅读,更多相关《Visual C++本地并行编程中的状态管理_.docx(7页珍藏版)》请在三一文库上搜索。

1、Visual C+本地并行编程中的状态管理_ 任务组取消 新的Beta1 PPL的其中一个功能就是可以取消正在运行中的任务组。在task_group类型上加入run 和 wait方法是一个新的cancel方法。还有一个相应的is_canceling方法让你可以检查在进程中是否完成取消。 task_group_status列举也有一个新的值叫做canceled,让你检查取消是否发生。以下的代码展现了这些新的功能: /declare tasks and run tasks task_group tg; tg.run(printf(consoleWrite0n);); tg.run(printf(c

2、onsoleWrite1n);); /cancel tasks tg.cancel(); /check whether tasks are being cancelled bool taskGroupIsCanceling = tg.is_canceling(); /check on status of task group task_group_status status = tg.wait(); if (status = completed) printf(Tasks were completed successfullyn); else if (status = canceled) pr

3、intf(Tasks were canceled during task executionn); else printf(An exception occured during task executionn); Combinable 类型 达到并行执行编程任务的最大利益的有效形式之一是工作在本地拷贝或是子数据上的每一个并行分支被处理,然后当处理结束后,将结果合并。这个形式可以最大限度的削减资源争用,而且削减潜在的死锁和当并行线程试图更新相同的内存位置时所发生的数据不全都的问题。 用法这个形式没有那么简单,但是需要很乏味的为每一个用法进行手动编码。为了简化形式用法,Visual C+ 202

4、1 Beta 1 添加了combinable模版类型。这个模版参数传递到combinable是每个任务将要操作的对象类型。这个类型必需有一个默认的构造器和一个拷贝 构造器。通过用法local方法,每个任务访问它自己的combinable管理资源的拷贝。 当全部任务结束后,通过用法combine 或是 combine_each方法,你可以将全部结果合并到一个结果集中。 以下的代码用三个独立的任务添加一些元素给一个矢量,然后用两个合并的方法将结果合并成一个矢量。 /declare a combinable vector of integers combinable vector int v; /a

5、dd an element to the vector using three separate tasks parallel_invoke( v.local().push_back(1); , v.local().push_back(2); , v.local().push_back(3); ); /merge the task-local copies using combine_each vector int result1; bine_each( (vector int local) result1.insert(result1.end(), local.begin(), local.

6、end(); ); /merge the task-local copies using combine vector int result2 = bine( (vector int left, vector int right)-vector int left.insert(left.end(), right.begin(), right.end(); return left; ); 要留意的是在最终一行的代码语句中的lambda表达式的明确返回类型声明的用法。在lambda表达式中的两个语句阻挡编译器正确推断返回类型,所以需要手动声明。 也可以为没有默认构造器(或是在许多状况下默认构造器的

7、用法是不合适的)的类型用法combinable,通过用法combinable构造 器,它是采纳了一个发生器功能创建了一些模版参数类型的对象。上面代码的前面几行是用法超载发生器构造器而重新编写的。在这种状况下,发生器功能返回已经 包含一个元素的矢量。 /declare a combinable vector of integers inable vector int v(return vector int(1, 0);); 同步 Combinable的用法取决于不需要作用在其他任务上的结果的任务。在多重任务的状况下需要分享一个对象,你必需用法更传统的同步策略。 PLL本身带有三个同步原语crit

8、ical_section, reader_writer_lock 和 event。critical_section锁住内存位置防止没有锁的全部任务的访问。对于内存位置将有许多同时读取者和少数编写者,更优化的 reader_writer_lock是可用的,允很多重读取者猎取锁并同时访问内存位置。最终的原语是event,用于在任务和线程之间发信号。 同步原语在concrt.h标题文件(是PPL的基本标题文件,包含在ppl.h中)中被定义。在concrt.h中定义的大多数类型的目标是 图书馆,而不是应用程序的开发者,但是任何对深层并行开发感爱好的人都可以自由的调查和用法恰当的来自暴露在外的类型的功能

9、。 critical_section类型的API是特别简洁的;你用法一个blocking lock方法来猎取这个锁,non-blocking try_lock会试图去猎取这个锁,假如它可用的话,而且unlock会释放一个锁住的critical_section。 reader_writer_lock是有一点点的简单。它添加了两个方法,lock_read 和try_lock_read,可以支持猎取一个reader lock。Unlock方法和critical_section是一样的,而且将释放恰当的基于锁类型的锁。 最终的同步原语是event,这是手动复位大事(即:大事保持设置直到用外部代码进行手

10、动复位)。代码可以通过调用实例wait方法(也是支持 一个可选的timeout值),等待一个单一大事被设置。当没有timeout被定义的时候,等待的时间是无限的。你可以等待多重大事,通过用法静态 wait_for_multiple,它接受C-style的event pointers。wait_for_multiple方法等待一个单一大事或是全部的大事传递到方法调用。以下的代码等待这两个大事被设置: event* events2; events0 = new event(); events1 = new event(); parallel_invoke( events0-set(); , events1-set(); ); bool waitForAllEvents = true; event:wait_for_multiple(events, 2, waitForAllEvents); 当同时执行许多任务的时候,处理状态管理是特别艰难的工作。PPL供应对状态管理的一种形式的支持,就是每个线程在本地版本的分享对象上进行操 作,在程序结束的时候将这些结果合并起来。对于分别状态管理的状况是不恰当的,PPL以critical_section, reader_writer_lock 和 event的形式供应传统的同步原语。 更多信息请查看IT技术专栏 .

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1