繁体   English   中英

DWScript是线程安全的吗?

[英]Is DWScript thread-safe?

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

Arnaud给出了关键点:

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

运行多个脚本执行类似于Delphi中有多个线程,虽然每个新执行不仅有自己的堆栈(如Delphi线程),还有自己的变量空间(在Delphi中,如果你有“线程”,它会有点像var“无处不在”。 并且DWScript执行不必在他们自己的线程中,它们可以跨线程移动,或者在较少数量的线程中轮询和使用(唯一的限制是每次执行仅由一个线程一次使用,如上文提到的)。

所以没有什么可以阻止你暴露一个会在脚本函数中产生一个线程(和相应的执行)的函数,但跨执行的通信不会通过共享变量(就像你可能想在Delphi中做的那样),但会有通过您自己的公开函数(或外部变量),返回值(使用“评估”方法,参见单元测试),“共享”对象实例或“全局变量”。

“global vars”是指dwsGlobalVarsFunctions.pas中定义的函数,它们可用于执行间数据交换。 要激活它们,只需在项目中的某处“使用dwsGlobalVarsFunctions”即可。

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

甚至没有必要打开DWS文档。 :)

只需看看Eric的StackOverflow答案

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

简而言之:

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

当然,这是关于DWS中线程安全的官方文档页面

现在,您可以根据需要为给定的IdwsProgram执行尽可能多的程序执行,每次执行仅将内存用于其堆和堆栈,编译的表达式树是共享的。 两个新接口都使用引用计数内存管理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM