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

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

最佳答案

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


我没有任何明显的证据可以支持这一点,但是由于文档甚至都没有提到线程安全,我认为所有libclang都应该被认为不是线程安全的。

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


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


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

另一种选择是希望(或在源代码中进行验证)libclang开发人员保留与CXIndex关联的所有数据,因此不要在其代码中引入可能的数据争用。然后,您可以为每个线程提供自己的索引,自己的翻译单元等。当您拥有“工作”时,您将启动一个线程(或重用一个线程)以对其进行处理。如果在此期间不再需要结果,则只要准备好结果就将其丢弃。

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

10-11 16:06