关键词:
【中文标题】OpenMP:如何在任务中实现线程本地对象?【英文标题】:OpenMP: how to realize thread local object in task? 【发布时间】:2020-07-30 08:49:00 【问题描述】:我要做的是并行迭代容器的所有元素,类似于#pragma omp for
;但是,有问题的容器不提供随机访问迭代器。因此,我通过this *** answer 中描述的任务使用解决方法:
for (std::map<A,B>::iterator it = my_map.begin();
it != my_map.end();
++it)
#pragma omp task
/* do work with it */
我的问题是每次迭代都需要一个“暂存空间”对象;这个对象在构建或复制到任务的数据环境中是昂贵的。每个线程只需要一个线程本地对象;从某种意义上说,每个任务都使用执行它的线程的对象。 private
需要一个副本,shared
导致竞争条件。 有没有办法通过 OpenMP 实现这一点?
我研究了#pragma omp threadprivate
,但是对象不是静态的,因为程序的结构看起来像这样:
method(int argument_for_scratch_object)
#pragma omp parallel
Object scratch(argument_for_scratch_object);
//some computations are done here...
#pragma omp single nowait
//here goes the for loop creating the tasks above
//each task uses the scratch space object
如果scratch
在并行区域之前被声明为静态(然后变为threadprivate
),它将使用第一个方法调用的argument_for_scratch_object进行初始化;这对于后续的方法调用可能不正确。
【问题讨论】:
#pragma omp threadprivate
确实是您想要的。至于“对象不是静态的”——为什么?然后,将它们设为静态。
我相信threadprivate
变量必须是全局(文件范围)或块范围内的静态或静态类成员。非静态 threadprivate
块范围变量对我来说没有太大意义。请记住,threadprivate
是变量定义时的属性,而不是打开并行作用域时的数据共享属性。如需完整答案,请描述您使用/管理 scratch space 对象以及为什么不能选择静态或全局对象。
感谢您的 cmets @DanielLangr 和 @Zulan!澄清一下:所有这些都发生在一个方法中,暂存空间对象构造函数需要该方法的一个参数。如果我将暂存空间对象设为静态,则在随后的方法调用中可能不正确。 (希望我理解正确,如果这是初学者的误解,我深表歉意)
【参考方案1】:
根据您的更新,我建议使用全局/静态线程私有指针,然后由并行部分中的每个线程对其进行初始化。
static Object* scratch_ptr;
#pragma omp threadprivate(scratch_ptr);
void method(int argument_for_scratch_object)
#pragma omp parallel
scratch_ptr = new Object(argument_for_scratch_object);
...
delete scratch_ptr;
【讨论】:
如何在java中实现跨线程的通讯
...多线程来共同完成一个任务,这就牵扯到线程间的通讯。如何让两个线程先后执行?Thread.join方法privatestaticvoiddemo2(){ThreadA=newThread(newRunnable(){@Overridepublicvoidrun(){printNumber("A");}});ThreadB 查看详情
OpenMP C++ 中的线程
】OpenMPC++中的线程【英文标题】:ThreadsinOpenMPC++【发布时间】:2011-01-0719:26:47【问题描述】:我需要在C++OpenMP中实现C#线程效果..Threadt=newThread(func1);t.Start();//Dosomething//Dosomethingelse请注意,父母或孩子都没有等待加入..我可以在C++O... 查看详情
如何在 Swift 中实现线程安全的 HashTable (PhoneBook) 数据结构?
】如何在Swift中实现线程安全的HashTable(PhoneBook)数据结构?【英文标题】:HowtoimplementaThreadSafeHashTable(PhoneBook)DataStructureinSwift?【发布时间】:2018-08-1214:32:48【问题描述】:我正在尝试实现一个线程安全的电话簿对象。电话簿应该... 查看详情
Java varargs 是如何在内存中实现的
】Javavarargs是如何在内存中实现的【英文标题】:HowareJavavarargsimplementedinthememory【发布时间】:2019-01-1108:32:56【问题描述】:据我所知,本地变量和参数存储在堆栈内存中,其中包括对象引用,而实际对象存储在堆内存中。那么... 查看详情
如何在 Spring Boot 中实现 Camunda SendTask
】如何在SpringBoot中实现CamundaSendTask【英文标题】:HowtoimplementCamundaSendTaskinSpringBoot【发布时间】:2020-10-0914:06:21【问题描述】:我是Camunda的新手,正在使用以下任务:业务规则任务-->(网关)-->发送任务-->用户任务在使... 查看详情
如何在 Hammerspoon 初始化中实现周期性任务?
】如何在Hammerspoon初始化中实现周期性任务?【英文标题】:HowtoimplementperiodictaskinHammerspooninitialization?【发布时间】:2020-09-1221:56:18【问题描述】:我认为当我的网络连接中断或恢复时收到通知会很棒,所以我把它放在我的Hammers... 查看详情
如何在 C# 中实现线程关联?
】如何在C#中实现线程关联?【英文标题】:HowdoIimplementthreadaffinityinC#?【发布时间】:2017-12-1422:09:33【问题描述】:我有一个需要线程关联的第三方API。我在我的服务应用程序中使用WCF来处理来自客户端的请求,然后将这些请求... 查看详情
如何在一个类中实现异步
...多开发者受益。那么回到最初的地方,传统的前端开发中如何实现异步编程呢?下面列举了js实现异步编程的四种方式。方法一:使用回调函数方法二:事件监听可以定义一个事件,并为这个事件设定处理函数。这样只有当这个... 查看详情
如何在Java中实现多个线程来下载单个表数据?
】如何在Java中实现多个线程来下载单个表数据?【英文标题】:HowtoimplementseveralthreadsinJavafordownloadingasingletabledata?【发布时间】:2012-01-0916:15:07【问题描述】:如何实现多个线程的多个/相同连接,以便快速下载单个大表数据。... 查看详情
如何在Java中实现多个线程来下载单个表数据?
】如何在Java中实现多个线程来下载单个表数据?【英文标题】:HowtoimplementseveralthreadsinJavafordownloadingasingletabledata?【发布时间】:2012-01-0916:15:07【问题描述】:如何实现多个线程的多个/相同连接,以便快速下载单个大表数据。... 查看详情
利用argument对象在javascript中实现重载(overload)
...时:一项任务,根据不同的参数,执行不同的操作流程时如何:js语法不支持重载效果变通:所有函数对象内,都自动内建了一个其功能实现情况如下:functionpay(){console.log("微信支付");}fu 查看详情
如何在头文件C++中实现类对象
】如何在头文件C++中实现类对象【英文标题】:HowtoimplementclassobjectsinheaderfileC++【发布时间】:2019-07-2406:12:47【问题描述】:如何在头文件中实现类对象,以便每次包含头文件时,都可以访问cpp文件中的对象?这是我现在的代码... 查看详情
如何获得在整个程序执行期间可能创建的最大 OpenMP 线程数?
】如何获得在整个程序执行期间可能创建的最大OpenMP线程数?【英文标题】:HowcanIgetthemaximumnumberofOpenMPthreadsthatmaybecreatedduringthewholeexecutionoftheprogram?【发布时间】:2016-05-1818:35:37【问题描述】:我想创建一个全局对象数组(OpenMP... 查看详情
如何使用对象列表在片段中实现newinstace模式[重复]
】如何使用对象列表在片段中实现newinstace模式[重复]【英文标题】:Howtoimplementnewinstacepatternsinthefragmentusingalistofobjects[duplicate]【发布时间】:2018-01-1005:15:26【问题描述】:如何将在改造2的活动中检索到的对象列表传递给使用新... 查看详情
如何在 Fragment 中实现 Google Maps 并使用 GoogleMap 对象?
】如何在Fragment中实现GoogleMaps并使用GoogleMap对象?【英文标题】:HowtoimplementGoogleMapswithinaFragmentandusetheGoogleMapobject?【发布时间】:2015-01-0722:04:54【问题描述】:如何在Fragment中实现GoogleMap?我正在尝试开发相同的东西,但是getMap... 查看详情
如何在teams中实现审批任务(代码片段)
... 正文 先睹为快,我们先看看效果,再看看如何去操作! 这样,我们就可以通过在Teams中点击审批、拒绝,当然 查看详情
如何在 .NET 中实现夜间进程?
】如何在.NET中实现夜间进程?【英文标题】:Howtoimplementanightlyprocessin.NET?【发布时间】:2011-06-2008:00:30【问题描述】:我有一组任务,我想每天晚上执行。这些任务依次包括查询数据库、移动然后重命名一些图像以及更新数据... 查看详情
如何在 Java 中实现包装装饰器?
】如何在Java中实现包装装饰器?【英文标题】:HowtoimplementawrapperdecoratorinJava?【发布时间】:2016-04-0807:20:35【问题描述】:问题是创建现有对象的动态增强版本。我无法修改对象的Class。相反,我必须:子类化它将现有对象包装... 查看详情