Concurrency 什么';在Tcl中,防止进程崩溃的最佳方法是什么?

Concurrency 什么';在Tcl中,防止进程崩溃的最佳方法是什么?,concurrency,tcl,semaphore,Concurrency,Tcl,Semaphore,Tcl是否有类似于信号量的东西?我需要阻止某个程序的再入。这样的方法在大多数情况下都能奏效: set inside_A 0 proc A {} { global inside_A if { $inside_A } { return "Ouch!" } incr inside_A ... incr inside_A -1 } 但是,这是不可靠的,因为块检查和增量不是原子的。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 interp都在单个线程中运行。因此,在检查和增量之间不可能有任何东西调用进程A。这意味着您概述的方法是安全的

事实上,没有任何东西可以调用proc A,除非它允许通过调用一个可能回调到A的proc,如果作为协同程序运行,则通过让步,或者通过运行update来实现。后一种选择通常是糟糕的设计,如果可能的话,应该避免


当A作为协同程序运行时,必须特别小心。协同程序可能会重新启动,这将阻止最终减量永远运行。这样就不可能再次调用函数。

您是否试图阻止该函数的递归调用?还是只能调用一次的函数?@Shawn,这个函数是从GUI间接调用的,并以足够快的点击顺序同时调用,根据应用程序逻辑,它当然不应该这样做。我无法控制点击;我唯一的办法是拒绝重入。如果你做了两个调用同一个过程的协程,那么这个过程不会有重入问题,除非它对全局变量做了一些不利于这种使用的事情。过程调用具有独立的局部变量。我的协同程序注释是关于启动一个与当前正在运行的协同程序同名的协同程序。这将删除旧的协同程序,剥夺它完成过程a的机会。@SchelteBron,唉,事实并非如此。这个特殊的Tcl解释器是Qt应用程序的一部分,它允许并发(事实上,它在Qt应用程序上非常流行)。解释器对象必须是唯一的。99%的情况下,这不是问题,但同一个不可重入过程每过一次就会被击中两次。因此,问题就来了。那么该应用程序所做的事情与Tcl的设计原则不符。我怀疑这会导致比两次运行不可重入过程更糟糕的问题,因为Tcl不是按这种方式工作的。显然,Tcl没有为不可能的事情提供保护的方法。顺便说一句,各位,如果{[incr my_semaphore]>1}起作用,就会发现