tcl 解释器参数被污染
tcl interpreter parameters contaminated
我有一个多线程 C++ 程序,其中主线程创建两个 tcl 解释器,interp#1 和 interp#2。在并行运行ning期间,主线程和一个从线程分别尝试通过interp#1和interp#2调用不同的cmd。在某些时候,内存错误发生并且程序崩溃。
日志文件告诉我,interp#1 的 kObjv[] 的某些值被 interp#2 的值污染了。
我还 运行 helgrind 来检查可能的数据竞争,它会在 tcl lib api 下转储大量数据竞争风险,例如:Tcl_NewStringObj/TclFreeObj/ResetObjResult/TclNREvalObjv,等等
看起来底层内存由同一线程的解释器共享。真的吗?我的程序链接静态 tcl 8.6 lib,它是在启用线程的情况下安装的。
Tcl 库使用线程绑定内存池来(极大地!)减少全局锁的压力,结果每个 Tcl 解释器对象也与创建它的线程强绑定。 (这就是单元线程模型,如果您熟悉的话。)您不能从任何其他线程安全地使用 Tcl 解释器。如果您想在每个线程中访问 Tcl 解释器,每个线程都应该创建自己的解释器并使用它。
有一些操作允许安全的线程间通信,特别是 Tcl_ThreadQueueEvent()
和 Tcl_ThreadAlert()
,它们允许您提交消息供其他线程在准备就绪时处理(每个带有 Tcl 解释器的线程在 Tcl 库中有一个与之关联的事件队列;这是 Tcl 事件通知引擎的核心)。
建议您使用 Tcl 线程包(它应该是任何良好的 Tcl 8.6 安装的一部分,并且也适用于旧版本)用于 Tcl 中的线程间工作。除了让每一方都知道另一个线程的句柄是什么的复杂性之外,它真的很容易使用。
我有一个多线程 C++ 程序,其中主线程创建两个 tcl 解释器,interp#1 和 interp#2。在并行运行ning期间,主线程和一个从线程分别尝试通过interp#1和interp#2调用不同的cmd。在某些时候,内存错误发生并且程序崩溃。 日志文件告诉我,interp#1 的 kObjv[] 的某些值被 interp#2 的值污染了。 我还 运行 helgrind 来检查可能的数据竞争,它会在 tcl lib api 下转储大量数据竞争风险,例如:Tcl_NewStringObj/TclFreeObj/ResetObjResult/TclNREvalObjv,等等
看起来底层内存由同一线程的解释器共享。真的吗?我的程序链接静态 tcl 8.6 lib,它是在启用线程的情况下安装的。
Tcl 库使用线程绑定内存池来(极大地!)减少全局锁的压力,结果每个 Tcl 解释器对象也与创建它的线程强绑定。 (这就是单元线程模型,如果您熟悉的话。)您不能从任何其他线程安全地使用 Tcl 解释器。如果您想在每个线程中访问 Tcl 解释器,每个线程都应该创建自己的解释器并使用它。
有一些操作允许安全的线程间通信,特别是 Tcl_ThreadQueueEvent()
和 Tcl_ThreadAlert()
,它们允许您提交消息供其他线程在准备就绪时处理(每个带有 Tcl 解释器的线程在 Tcl 库中有一个与之关联的事件队列;这是 Tcl 事件通知引擎的核心)。
建议您使用 Tcl 线程包(它应该是任何良好的 Tcl 8.6 安装的一部分,并且也适用于旧版本)用于 Tcl 中的线程间工作。除了让每一方都知道另一个线程的句柄是什么的复杂性之外,它真的很容易使用。