libgit2-前景与背景

libgit2 - Foreground vs. Background

本文关键字:背景 libgit2-      更新时间:2023-10-16

我正在使用libgit2 API编写一个Qt应用程序。某些函数显然被放在后台线程中:

git_remote_fetch

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

git_reference_is_valid_name

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

对于libgit2,有什么线程指导原则或建议吗?文档中似乎没有提到这一点,而且信息也有些稀疏。

更新:具体来说,根据线程指导原则,我正在寻找关于在前台或后台工作任务中使用特定函数的建议文档,而不是线程安全性。目前,我已将本地操作置于前台任务中,除非它们会产生性能问题。

这些准则与任何其他库或代码都是一样的。如果它不是即时的,您可以将它放在后台线程中,并释放UI线程,直到它完成为止。

git/libgit2主要是关于I/O的(除了访问器,您可以区分它们,因为它们返回的是一个值而不是错误代码),这意味着执行任何操作通常都需要未知的时间。

根据上次调用libgit2后发生的情况,它可能需要更新其包文件列表,或者可能需要读取完整的refs文件,而不仅仅是一个。如果文件系统在另一台计算机上,情况会变得更糟。

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

对于libgit2,有什么线程指导原则或建议吗?文档中似乎没有提到这一点,而且信息也有些稀疏。

是的,有。

  • 来自自述

初始化

图书馆需要了解一些全球性的情况。呼叫

git_libgit2_init();

在调用任何其他libgit2函数之前。你可以多次调用此函数。的匹配呼叫数

git_libgit2_shutdown(); 

将释放资源。请注意,如果您工作线程之后,应该调用git_libgit2_shutdown线程已退出。如果您需要协助协调,只需让工作线程在启动时调用git_libgit2_init停堆时的git_libgit2_shutdown

  • 摘自THREADING.md

您可以从任何线程安全地使用任何libgit2对象,尽管可能存在问题,具体取决于加密库libgit2或其dependencies链接到(稍后将对此进行详细介绍)。对于libgit2本身,只要你考虑到以下几点,你就不会遇到问题:

共享对象

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