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

标签 c multithreading asynchronous tcl

我有一个 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/

相关文章:

c - 将参数传递给 pthread_create - 从 void(*)() 到 void(*)(void*) 的无效转换

C - 'Greater than' 与 'Greater than or equal to' 性能

c - 查找所有连接到网络的计算机并获取它们的 IP 地址 - Windows C

c# - 如何同步等待取消异步任务

python - 如何使用 requests_html 异步 get() URL 列表?

c - 包装 malloc - C

python - 如何多线程从列表中读取字典并进入数据库

java - 与所有者框架异步打开 JDialog 的问题

python - 异步 Python 类

javascript - Node.js 中循环异步函数内 undefined variable