STK组件模式:多线程

翻译,原文:http://help.agi.com/AGIComponents/html/Multithreading.htm

STK组件是为多线程设计的。它执行的许多操作,例如预报和计算过境,都是使用多个线程自动并行执行的,这使库能够充分利用现代多核处理器。

与STK组件的其他库相比,Insight3D具有不同的线程策略,请参见下面的Insight3D部分。

STK组件中的线程

你可以通过更改线程策略ThreadingPolicy来控制STK组件对线程的使用。线程策略是与每个线程关联的配置信息,它控制该线程启动的可并行操作如何使用线程。默认情况下,策略指定可并行操作为系统上的每个逻辑处理器创建一个线程。例如,如果你的系统有四个内核,并且每个内核都是超线程的(意味着它支持两个硬件线程),那么STK组件将自动创建并使用八个线程来计算过境、覆盖率等。
通过设置NumberOfThreads属性,可以指定要使用的线程数。例如,下面的代码指定当前线程创建的可并行操作应该只使用五个线程来执行它们的工作。

ThreadingPolicy.NumberOfThreads = 5;

你还可以通过将NumberOfThreads设置为1或调用ConfigureTouseCurrentThreadOnly方法完全禁用多线程。当线程策略配置为仅使用一个线程时,可并行操作将使用调用线程执行,并且不会创建其他线程。

ThreadingPolicy.ConfigureToUseCurrentThreadOnly();

根据ThreadSource属性的值,可以从线程池中招募新线程,也可以显式创建新线程供可并行操作使用。默认情况下,线程从线程池中招募。以下代码更改属性,以便创建新线程:

ThreadingPolicy.ThreadSource = ThreadSource.NewThread;

从线程池中招募线程通常比直接创建线程快得多。但是,有时避免使用线程池是有用的,这样线程池就不会被长时间运行的操作独占。

线程安全

这种库范围内的多线程处理需要在整个库中小心地注意线程安全。需要注意一个类型对于多个线程同时使用什么时候是安全的,什么时候是不安全的。
一般来说,STK组件中的所有类型(除Insight3D之外,见下文)都是只读访问的线程安全类型。换句话说,只要方法和属性不修改对象的状态,就可以从多个线程同时调用方法和访问实例的属性。但是,如果一个线程在另一个线程读取属性或执行方法时修改对象,则第二个线程可能会遇到对象的不一致状态,或者对象可能会引发异常。
此外,静态方法和属性可以从多个线程同时使用。此外,可以从多个线程同时使用同一类型的两个不同实例。并且只要你确保一次只有一个线程访问它,就可以从任何线程(甚至多个线程)自由地使用单个实例。在极少数情况下,这些规则的例外情况将在参考文件中明确说明。
STK组件中的某些类型(尤其是Evaluator)实现了IThreadAware接口。实现此接口的类型对于只读访问甚至可能不具有线程安全性,如上所述。如果此接口上的IsThreadSafe属性返回true,则可以假定实例与stk组件中的大多数对象一样具有线程安全性;只要没有线程修改实例,则可以同时使用多个线程中的实例。但是,如果返回false,则在任何情况下都不能同时从多个线程使用该实例。
幸运的是,实现IThreadAware的所有类型也实现ICloneWithContext,这意味着您可以使用CopyForAnotherThread来制作实例的副本。然后,可以同时从多个线程使用原始线程和任何副本。此外,只要没有线程同时修改实例,就可以安全地从多个线程同时复制另一个线程的实例。
以下代码创建一个PointEvaluator(实现IThreadAware)来计算点的位置,然后准备将其传递给新线程:

PointEvaluator evaluator = point.GetEvaluator();
PointEvaluator evaluatorForNewThread = CopyForAnotherThread.Copy(evaluator);

CopyForNotherThread可以安全地用于实现IThreadAware的任何类型,不管它是否报告自己是线程安全的。当对线程安全的类型调用CopyForNotherThread.copy<T>时,它将返回现有实例,而不进行其他副本。

InSight3D

InSight3D目前不支持多线程。所有与InSight3D类型的交互都必须从单个线程完成。即使用户确保一次只有一个线程与InSight3D交互,也不能保证从多个线程使用insight3d类型是安全的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  •   一个任务通常就是一个程序,每个运行中的程序就是一个进程。当一个程序运行时,内部可能包含了多个顺序执行流,每个顺...
    OmaiMoon阅读 1,662评论 0 12
  • 进程 什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内...
    45b645c5912e阅读 465评论 0 5
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,082评论 1 32
  • iOS多线程编程 基本知识 1. 进程(process) 进程是指在系统中正在运行的一个应用程序,就是一段程序的执...
    陵无山阅读 5,996评论 1 14
  • 秋天是一个多彩的季节,秋天是一个丰收的季节,秋天是一个落叶飘飘、姿态万千的季节,在这个多彩的秋天里,大自然中的一切...
    李红军老师阅读 347评论 0 1