c++ - 取消 libclang 任务

标签 c++ multithreading libclang

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

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

最佳答案

[..] it seems it is intended to be accesses from single thread only.

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

但是:看到基本上 libclang 所做的一切都(间接地)绑定(bind)到 CXIndex 我会猜测你可以有一个 CXIndex线程,然后并行使用它们(或从它们创建的任何东西)(但不在线程之间“共享”任何东西)。

If there is also no mechanism to cancel tasks, then one has to wait till the task finishes even if the results are not needed anymore. Does anybody have any ideas on how to overcome this?

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

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

关于c++ - 取消 libclang 任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40314407/

相关文章:

c - 使用 libclang 在 for 循环中查找条件评估

Windows 上的 python libclang 绑定(bind)无法从 sublime text 初始化翻译单元

c++ - 无法打开套接字 C++

c++ - C 语言中的 VecDoub 等效项?

c++ - .size() 字符串操作不读取字符的实际长度/大小 c++

java - 我如何知道提交给执行器的任务是否抛出异常?

c++ - 我应该在我的库中使用线程吗?

c++ - 将无符号整数从 C++ COM 对象传递到 VB6

java - 如果一个线程试图获取它已经持有的锁会发生什么?

c++ - libclang/libtooling 处理或关闭所有错误输出