libgit2 - 前景与背景

时间:2015-02-28 21:11:31

标签: c++ qt libgit2

我正在使用libgit2 API编写Qt应用程序。某些功能显然放在后台线程中:

git_remote_fetch

其他很容易在前台线程中内联完成(即在单击的插槽中进行验证):

git_reference_is_valid_name

但是,有许多调用不清楚它们是否应该放在后台线程中。我可能会谨慎行事,并将所有内容放在后台线程中。或者,为方便起见,我可以将本地操作置于前台,除非遇到性能问题(即状态)。我不一定喜欢后一种选择,因为如果对我来说操作很快,我不一定能保证每次其他人都会很快。

libgit2是否有任何类型的线程指南或建议?它似乎没有被文档解决,信息有点稀疏。

更新:具体来说,通过线程指南,我正在寻找有关在前台或后台工作人员任务中使用特定功能的建议的文档,而不是线程安全性。目前,我已经将本地操作放在前台任务中,除非它们产生性能问题。

2 个答案:

答案 0 :(得分:1)

  

libgit2是否有任何类型的线程指南或建议?它似乎没有被文档解决,信息有点稀疏。

是的。

  

初始化

     

图书馆需要跟踪一些全球状态。   呼叫

git_libgit2_init();
     

在调用任何其他libgit2函数之前。您   可以多次调用此函数。对

的匹配次数匹配
git_libgit2_shutdown(); 
     

将释放资源。请注意,如果你有   工作线程,你应该在那之后调用git_libgit2_shutdown   线程已经退出。如果您需要协助协调,   只需让工作线程在启动时调用git_libgit2_init即可   关机时git_libgit2_shutdown

  

您可以安全地使用任何线程中的任何libgit2对象,尽管如此   可能是问题取决于加密库libgit2或其   依赖项链接到(稍后将详细介绍)。对于libgit2本身,   如果您考虑到以下因素,您将不会遇到   的问题:

     

分享对象

     

一次使用单个线程中的对象。大多数数据结构本身并不能防止并发访问。这是   因为它们很少被孤立地使用,因此更有意义   通过更大的锁或类似机制同步访问。        有些对象是只读/不可变的,因此可以安全地跨线程共享,例如引用和配置   快照。

答案 1 :(得分:1)

这些指南与任何其他库或代码相同。如果它不是立即的,你将它放在后台线程中并释放UI线程直到它完成。

git / libgit2主要是关于I / O(除了访问者,你可以分辨它们,因为它们返回一个值而不是一个错误代码),这意味着它通常会占用未知数量的时间来执行任何行动。

根据自上次调用libgit2以来发生的情况,它可能需要更新其所包装文件的列表,或者可能需要读取完整打包的refs文件而不仅仅是那个文件。如果文件系统位于不同的计算机上,这会变得更糟。

由于I / O和文件系统位于世界的任何地方,任何不是访问者的东西都可能花费无限的时间。您希望在UI线程上调用哪些操作取决于您愿意在任何时间点对数据的位置和新鲜度做出哪些假设。