爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 3509|回复: 0

[混合编程] IDL编程学习之多线程案例

[复制链接]

新浪微博达人勋

发表于 2018-7-19 17:21:57 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
从某大神处借鉴了一个案例,能读懂,原地址:http://www.wingwy.com/archives/2013_08_1480.html
题设:a=b=findgen(10000,10000)+1,求total(a*b)+total(a/b)
程序分了2个线程同时计算total(a*b)和total(a/b)
代码与注解:
新建一个IDL_IDLBridge对象,用于第1个线程:
  oBridge1 = OBJ_NEW('IDL_IDLBridge')
这个对象中新建属性a,b,c:
  obridge1->setvar, 'a', findgen(10000,10000)+1
  obridge1->setvar, 'b', findgen(10000,10000)+1
  obridge1->setvar, 'c', findgen(10000,10000)+1
计算出c=total(a*b):
  oBridge1->Execute,'c=total(a*b)',/nowait
输出状态status,布尔值,代表进程是否完结:
  print,oBridge1->Status()
  ;可以看一下状态,运行的时候是1,证明返回主程序了
新建另一个IDL_IDLBridge对象及其属性,用于第2个线程:
  oBridge2 = OBJ_NEW('IDL_IDLBridge')
  obridge2->setvar, 'a', findgen(10000,10000)+1
  obridge2->setvar, 'b', findgen(10000,10000)+1
  obridge2->setvar, 'd', findgen(10000,10000)+1
计算出d:
  oBridge2->Execute,'d=total(a/b)',/nowait
看线程状态:
  print,oBridge2->Status()
  ;看看实时状态,电脑不逆天的话也应该是1
  两个线程都停了才合并计算,不然一直在这里循环不进:  
  while ((oBridge1->Status() EQ 1) or (oBridge2->Status() EQ 1)) do begin
  endwhile
输出状态(不太理解为什么要输出):
  print,oBridge1->Status()
  print,oBridge2->Status()
  ;确认一下状态为0,表示两进程都算完了
  ;我推测,status=1表示正在运行,0表示没在运行
传递参数:
  c1=oBridge1->GetVar('c')
  c2=oBridge2->GetVar('d')
销毁对象,腾出内存:
  obj_destroy, obridge1
  obj_destroy, obridge2
合并结果:
  result=c1+c2
附件中也放了程序,与原作程序有所差别,根据自己的理解改的
我用tic-toc输出运行时间,很失落:
% Time elapsed: 6.2630000 seconds.
我直接计算之:
a=findgen(10000,10000)+1
b=findgen(10000,10000)+1
c=findgen(10000,10000)+1
d=findgen(10000,10000)+1
c=total(a*b)
d=total(a/b)
print,c+d
运行时间:
% Time elapsed: 1.1980002 seconds.
多线程居然慢很多!我擦~

multi_bridge.pro

1.52 KB, 下载次数: 0, 下载积分: 金钱 -5

密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表