2015-03-25 35 views
2

我的問題歸結爲標題:是rugged存儲庫實例(打算是)線程安全嗎?當我使用它時,我可能能夠解決我已經有更長時間的問題:在使用不同的Repository實例時使用堅固的(有意爲)線程安全訪問git存儲庫?堅固的存儲庫實例線程安全嗎?

語境

我使用堅固訪問存儲爲文件可以通過共享網絡前端訪問回購多個用戶的Git倉庫。到目前爲止,我爲每個訪問創建了一個新的Repository實例,因爲它表現得足夠好,似乎是安全的(我無法在文檔中找到保證,也沒有從使用libgit2的方式確定明顯的安全性,但沒有測試發現問題,而我假設libgit2本身是安全的)。

但是,我遇到了issue,這限制了您可以幾乎同時打開的存儲庫實例數量,這會導致某些腳本出現問題,這些腳本會重複使用爲每個git存儲庫訪問創建Repository實例的代碼。一個簡單的解決方案是在所有用戶之間共享Repository實例。但是,如果存儲庫實例不是線程安全的,則會導致問題。我需要使用Mutex來保護所有這些共享實例,還是我可以不使用,因爲堅固的/ libgit2已經爲我解決了這個問題?

回答

1

是的,libgit2(因此也是堅固的)應該是線程安全的,只要,因爲您不使用跨不同線程的同一個存儲庫實例(或從libgit2創建的任何其他對象)。

但正如問題的第二部分所示,您實際上希望跨不同線程使用同一個存儲庫實例。在這裏,回答是它取決於。 libgit2提供的大部分但不是全部的功能應該是線程安全的,但我不能給你一個明確的列表。有關更多信息,請參閱https://github.com/libgit2/libgit2/issues/2491

+0

謝謝,這個問題很好地解釋了這個狀態。我想我只是用一個Mutex序列化訪問repo。個別操作足夠快,用戶不會注意到。 – Confusion 2015-03-27 11:07:54