【问题标题】:Cancel libclang task取消 libclang 任务
【发布时间】:2016-10-28 23:12:16
【问题描述】:

这是一个简短的问题。我相信没有办法取消通过 python 绑定提交给 libclang 的作业(例如代码完成任务)。

谁能证明我错了?我对在多线程环境中使用 libclang 很感兴趣,但它似乎只打算从单线程访问。如果也没有取消任务的机制,那么即使不再需要结果,也必须等到任务完成。有人对如何克服这个问题有任何想法吗?

【问题讨论】:

  • libclang 不是工作队列,所以我不确定您指的是哪种“工作”或“任务”。
  • 抱歉不准确。我的意思是通过 libclang python 绑定调用函数。我在这里称它们为任务是为了强调我想同时调用它们。我们现在甚至只关注代码完成。所以假设我有一个翻译单元,我在上面运行代码完成功能。
  • 进行并发调用和取消这些事情听起来不像是 libclang 会涉及的事情。当然,如果 libclang 不是线程安全的,那么这些都不重要,但如果这就是你所需要的,你应该问那个具体的问题。

标签: c++ multithreading libclang


【解决方案1】:

[..] 似乎只打算从单线程访问。

我没有任何明确支持这一点的东西,但由于文档没有任何地方谈论线程安全,我认为所有的 libclang 都应该被视为不是线程安全的

但是:看到基本上 libclang 所做的所有事情都(间接)绑定到 CXIndex,我您可以在每个线程中拥有一个 CXIndex,然后使用这些(或任何创建的东西)来自它们)并行(但不在线程之间“共享”任何东西)。

如果也没有取消任务的机制,那么即使不再需要结果,也必须等到任务完成。有人对如何克服这个问题有任何想法吗?

“安全”的解决方案是将所有与 libclang 相关的代码移动到一个专用进程中。然后,您可以从您的主应用程序中启动(或终止)这些进程(使用依赖于操作系统的机制)。当然,就性能(启动进程)和开发工作(进程之间的序列化通信)而言,这都是“沉重的”。

另一种方法是希望(或在源代码中验证)libclang 开发人员将所有数据与CXIndex 关联,因此不会在其代码中引入可能的数据竞争。然后你可以给每个线程它自己的索引,它自己的翻译单元等。当你有一个“工作”时,你启动一个线程(或重用一个)来处理它。如果同时不再需要结果,那么您只需在(如果)它们准备好时丢弃结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    相关资源
    最近更新 更多