gpt4 book ai didi

c - 如何为 Tcl 编写异步 C 扩展?

转载 作者:太空宇宙 更新时间:2023-11-04 03:47:23 27 4
gpt4 key购买 nike

我有一个 C 函数,我想将其提供给 Tcl。问题是,我想以与::thread::send 相同的方式从 Tcl 进行异步调用,即使用 ?-async?和?变量名?旗帜。

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

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

如有任何帮助,我们将不胜感激。

最佳答案

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

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

关于c - 如何为 Tcl 编写异步 C 扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23220651/

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