首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DWScript是线程安全的吗?

DWScript是线程安全的吗?
EN

Stack Overflow用户
提问于 2012-06-02 17:44:56
回答 2查看 692关注 0票数 9

我想知道DWScript是否能够在脚本中使用线程,因为一些引擎不同步对其内部数据结构的访问。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-04 14:03:04

Arnaud给出了关键点:

  • 每次只能从一个线程调用每个编译器实例。您可以在多个线程中同时调用多个编译器实例,并且可以从多个线程中使用特定的编译器实例,前提是每次只有一个线程使用它。
  • 每个编译的程序都可以有多次执行,每次执行都可以在其自己的线程中运行。此外,一个特定的执行可以被多个线程使用,只要一次只有一个线程使用它。
  • 每次执行都有它自己的变量空间和自己的堆栈,对象实例在堆上,从技术上讲可以在执行之间共享,没有锁定机制,但你可以创建自己的。
  • 脚本引擎在使用公开给它的类或函数时不执行任何同步或锁定(无论是通过TdwsUnit,RTTI等),所以当在线程中运行脚本执行时,确保你只暴露线程安全的东西(特别要注意RTTI,因为很多RTL和VCL从一开始就不是线程安全的)

运行脚本的多个执行类似于在Delphi中拥有多个线程,尽管每个新的执行不仅有自己的堆栈(像Delphi线程),而且还有自己的变量空间(在Delphi中,这有点像到处都有"thread var“)。并且DWScript执行不必在它们自己的线程中,它们可以跨线程移动,或者轮询并在较少的线程中使用(唯一的限制是每次执行只能由一个线程使用,如上所述)。

因此,没有什么可以阻止您公开一个在脚本函数中产生线程(和相应的执行)的函数,但是跨执行的通信不会通过共享变量(就像在Delphi中那样),而是必须通过您自己公开的函数(或外部变量)、返回值(使用"evaluate“方法,cf )。单元测试)、“共享”对象实例或“全局变量”。

所谓“全局变量”,是指在dwsGlobalVarsFunctions.pas中定义的函数,这些函数可用于执行之间的数据交换。要激活它们,只需在项目中的某个位置添加"uses dwsGlobalVarsFunctions“即可。

它们公开了一组Read/WriteGlobalVar函数,这些函数允许在同一个Delphi进程中运行的所有脚本执行中存储和检索命名变量,并且从线程的角度来看,这些读取和写入是“原子的”。

票数 5
EN

Stack Overflow用户

发布于 2012-06-04 00:13:57

甚至不需要打开DWS文档。:)

看一看at this StackOverflow answer by Eric

例如,DWS现在能够对单个编译的脚本执行多个线程安全的执行,而旧的代码库是围绕一个编译的脚本一次只能由一个线程执行的限制而构建的。

简而言之:

  • DWS编译器不是线程安全的:您必须在一个线程内创建执行堆栈(您不能共享一个编译器实例,每个编译器实例需要一个线程);
  • 如果您在每个线程中使用一个执行实例,则DWS执行是线程安全的:您可以在线程之间运行相同的已编译脚本AFAIK,但如果您需要Delphi代码,则可以使用Delphi代码

当然,这里是the official documentation page about thread safety in DWS

对于一个给定的IdwsProgram,你现在可以有尽可能多的程序执行,每次执行将只使用内存用于堆和堆栈,编译后的表达式树是共享的。这两个新接口都使用引用计数内存管理。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10861299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档