防止 Tcl 中的过程重演的最佳方法是什么?



Tcl有类似信号量的东西吗?我需要阻止某个程序重新进入。像这样的操作在大多数情况下是有效的:

set inside_A 0
proc A {} {
global inside_A
if { $inside_A } {
return "Ouch!"
}
incr inside_A
...
incr inside_A -1
}

然而,这是不可靠的,因为块检查和增量不是原子的。Tcl是否有类似信号量的东西来可靠地防止重入?

每个Tcl接口在单个线程中运行。因此,在检查和增量之间不可能有任何东西调用进程A。这意味着您概述的方法是安全的。

实际上,没有任何东西可以调用进程A,除非它允许调用一个可能回调到A的进程,或者作为协程运行,或者运行update。后一种选择通常是糟糕的设计,应该尽量避免。

当A作为协程运行时,必须特别小心。协程可能会重新启动,这将阻止最后的减量运行。这样就不可能再调用A了。

相关内容

最新更新