如何为Tcl编写异步C扩展



我有一个C函数,我想让它对Tcl可用。问题是,我想以与::thread::send相同的方式从Tcl异步调用,即使用-异步?和varname?旗帜。

我不了解Tcl的异步C API,也找不到如何使用它的例子。在C端,我可以创建一个线程来做这项工作,但不知道如何在线程完成时发出信号,以及如何处理信号来设置Tcl命令中传递的varname选项指定的变量。

对于这个问题,我无法从Tcl端使用更简单的异步解决方案,例如用管道、Tcl线程或comm等库调用另一个进程。原因是C调用加载在大型数据结构中,并且存在暴露于Tcl的其他C调用,其假定(出于必要)用于该结构的存储器被分配在与Tcl interp相同的线程内。

任何协助都将不胜感激。

最简单的方法是编写与简单的API同步的C代码,并将其所有状态保持在ClientData广播结构中,如果可能的话,附加到命令或解释器,否则,使用线程特定的数据。然后,使用Thread包本身允许其他线程调用这些实用程序线程,并将其封装在Tcl代码中,使API看起来很自然,并(轻微地)隐藏了如何实现API。这很容易做到。

您还可以使用Tcl的C级线程API,因为thread包实际上只是一个包装器。(实际上是通过在线程之间发送事件来进行通信的;请查看Thread包中ThreadSend的定义以了解详细信息。)或者,如果您真的只进行I/O,则可以编写使用异步I/O和fileevent/notifier机制的代码。这些工作要比用上面概述的简单方式做事情并使用Tcl代码和现有包来完成大部分工作复杂得多。

您将需要使用TCL扩展架构,也就是TEA

最新更新