multithreading - 如何从非 tcl 线程异步调用 Tcl 线程中的命令?

标签 multithreading asynchronous tcl

我正在一个与 Tcl 解释器无关的 C 线程(我正在使用 pthreads)中做一些工作。它拥有指向现有 Tcl 线程的 ThreadId 和 TclInterp 的指针,并希望向该 Tcl 线程发送脚本以进行异步评估。

我可以用 XThreadUtil同步并且仅当我阻塞 Tcl 线程直到 C 线程完成执行。我真的需要异步行为。也就是说,所需的事件序列是:

  • tcl 线程调用生成 C 线程并立即返回的命令;
  • tcl线程事件循环恢复,C线程并发工作;
  • 当 C 线程完成工作时,它向 tcl 线程的事件队列发送一个事件并退出;
  • tcl 线程在准备好时处理事件。

  • 我尝试过使用 Tcl 线程通知 API (Tcl_ThreadQueueEvent/Tcl_ThreadAlert) 和异步 API (Tcl_AsnycCreate/Tcl_AsyncMark),但运气不佳。我一直没能找到太多的例子。任何帮助深表感谢。

    最佳答案

    Tcl_ThreadQueueEvent Tcl_ThreadAlert 是我过去使用过的。您需要记住 Tcl 主线程的线程 ID,以便使用 Tcl_GetCurrentThread 进行警报调用。

    tmsWinMailslot中有一个例子如果您查看 MailslotSignalledProc,它会从在此代码中监视 Windows 邮槽的工作线程引发 Tcl 事件。它使用 Windows 重叠 I/O,因此一旦某些数据在阻塞的 worker 上可用,此函数会读取并将其作为事件发布到 Tcl,然后再次开始读取以等待更多数据。

    关于multithreading - 如何从非 tcl 线程异步调用 Tcl 线程中的命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26911729/

    相关文章:

    multithreading - 多线程反向传播

    c# - 如何非异步下载数据?

    python - 异步操作应该用@asyncio.coroutine 装饰什么?

    asynchronous - Dart :io clean up Futures that timeout? 是如何实现的

    user-interface - 在 tcl tk 组合框中做出选择后如何运行脚本

    events - Tcl 中的事件循环

    tcl - 如何将列表解压缩为 Tcl 中的变量?

    multithreading - Go 运行时使用的线程数

    c# - 如何正确阻止方法直到对象计数器> 0?

    java - Android FileChannel 在不同的 AsyncTask 中读写失败