坚固的Repository实例是线程安全的吗?

时间:2015-03-25 08:30:19

标签: ruby git concurrency rugged

我的问题归结为标题:是rugged存储库实例(打算是)线程安全吗?

虽然我正在讨论这个问题,但我可以解决一个问题:我在使用不同的Repository实例时使用坚固的(打算是)线程安全来访问git存储库吗? / p>

上下文

我使用Rugged访问git存储库,该存储库存储可以通过共享Web前端访问存储库的多个用户的文档。到目前为止,我为每次访问创建了一个新的Repository实例,因为它运行良好并且似乎是安全的(我无法在文档中找到保证或从libgit2的使用方式确定明显的安全性,但没有测试发现问题而且我假设libgit2本身是安全的)。

但是,我遇到了issue,这限制了您可以近乎同时打开的存储库实例的数量,这会导致某些脚本出现问题,这些脚本会重用一些为每个git存储库创建存储库实例的代码访问。一个简单的解决方案是在所有用户之间共享Repository实例。但是,如果存储库实例不是线程安全的,那么这将导致问题。我是否需要使用Mutex保护所有这些共享实例,或者我可以不使用,因为rugged / libgit2已经为我解决了这个问题?

1 个答案:

答案 0 :(得分:1)

是的,libgit2(因此也很坚固)应该是线程安全的,只要,因为你不能在不同的线程中使用相同的存储库实例(或从libgit2创建的任何其他对象)

但正如问题的第二部分所示,您实际上希望在不同的线程中使用相同的存储库实例。在这里,答案是取决于。 libgit2提供的大部分功能(但不是全部)应该是线程安全的,但是我不能给你一个明确的列表。有关更多信息,请参阅https://github.com/libgit2/libgit2/issues/2491