gpt4 book ai didi

delphi - DWScript 是线程安全的吗?

转载 作者:行者123 更新时间:2023-12-03 14:48:14 24 4
gpt4 key购买 nike

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

最佳答案

阿诺给出了要点:

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

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

因此,没有什么可以阻止您公开在脚本函数中生成线程(以及相应的执行)的函数,但是执行之间的通信不会通过共享变量(就像您可能在 Delphi 中所做的那样),但必须遍历您自己公开的函数(或外部变量)、返回值(使用“评估”方法,参见单元测试)、“共享”对象实例或“全局变量”。

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

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

关于delphi - DWScript 是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10861299/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com