1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/fibjs-libgit2

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
threading.md 9.1 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 10.03.2025 21:57 67a8a28

Многопоточность в libgit2

Если не указано иное, объекты libgit2 нельзя безопасно использовать одновременно несколькими потоками.

Существуют также ограничения, связанные с использованием криптографических библиотек, используемых libgit2 или его зависимостей (более подробно об этом ниже). Если вы учтите следующие моменты, проблем возникнуть не должно:

Общий доступ к объектам

Используйте объект из одного потока за раз. Большинство данных не защищены от параллельного доступа самостоятельно. Это потому что они редко используются в изоляции, а значит имеет смысл синхронизировать доступ через более крупный замок или аналогичный механизм.

Некоторые объекты являются только для чтения/неизменяемыми и поэтому безопасны для использования несколькими потоками, такими как ссылки и снимки конфигурации.

Объект git_odb использует внутреннее блокирование и является многопоточно-безопасным для использования из нескольких потоков одновременно.

Сообщения об ошибках -------------------Сообщение об ошибке является локальным для потока. Вызов git_error_last() должен происходить в том же потоке, где произошла ошибка, чтобы получить сообщение. Часто это будет случай независимо от этого, но если вы используете что-то вроде GCD на macOS (где код выполняется на произвольном потоке), код должен гарантировать получение кода ошибки в потоке, где она произошла.Многопоточность и криптографические библиотеки

На Windows

Когда сборка производится как нативный DLL Windows, libgit2 использует WinCNG и WinHTTP, оба которых являются многопоточно-безопасными. Вам ничего специального делать не нужно.

При использовании libssh2, который сам использует WinCNG, нет необходимости выполнять какие-либо специальные шаги. Если вы используете среду MinGW или подобную, где libssh2 использует OpenSSL или libgcrypt, то общая ситуация затрагивает вас.

На macOS

По умолчанию мы используем CommonCrypto и SecureTransport для криптографической поддержки. Эти библиотеки являются многопоточно-безопасными и вам ничего специального делать не нужно.

Учитывайте, что libssh2 может всё ещё использовать OpenSSL. В этом случае, общая ситуация затрагивает вас при использовании SSH.

Общая ситуация -------------libgit2 по умолчанию использует OpenSSL для транспорта HTTPS (кроме Windows и macOS, как было указано выше). На любой системе mbedTLS может быть опционально включена как поставщик безопасности. OpenSSL является многопоточно-безопасной начиная с версии 1.1.0. Если ваша копия libgit2 связана с этой версией, вам не нужно принимать дальнейших действий. Старшие версии OpenSSL созданы с учетом того, чтобы быть независимыми от реализации потока, и пользователи библиотеки должны установить функцию блокировки, которую она должна использовать. libgit2 не может знать, какую функцию блокировки установить, так как пользователь libgit2 также может использовать OpenSSL самостоятельно, и настройки блокировки должны существовать вне периода жизни libgit2.Даже если libgit2 не использует OpenSSL напрямую, OpenSSL всё ещё может использоваться libssh2 в зависимости от конфигурации. Если OpenSSL используется более чем одной библиотекой, вам потребуется один раз настроить многопоточность для OpenSSL.

Если libgit2 связан с OpenSSL < 1.1.0, он предоставляет функцию помощи git_openssl_set_locking() (доступна в sys/openssl.h) для использования платформо-независимых механизмов блокировки для выполнения блокировки, которую вы можете использовать, если не хотите использовать OpenSSL вне libgit2 или знаете, что libgit2 будет жить дольше всех остальных операций. После вызова функции завершения работы libgit2 использование OpenSSL в многопоточной среде становится небезопасным. Обратите внимание, что git_openssl_set_locking() работает только тогда, когда libgit2 использует OpenSSL напрямую — если OpenSSL используется только как зависимость libssh2, как указано выше, git_openssl_set_locking() является пустым действием.

Если ваш язык программирования предлагает пакет/биндинги для OpenSSL, вы должны очень сильно предпочесть использование этого для настройки блокировки, так как они предоставляют уровень координации, который невозможен при использовании этой функции.См. документацию OpenSSL по многопоточному использованию для получения дополнительной информации, а также http://trac.libssh2.org/wiki/MultiThreading для конкретного примера предоставления обратных вызовов многопоточного использования.Libssh2 может быть связан с OpenSSL или libgcrypt. Если он использует OpenSSL, см. вышеупомянутые абзацы. Если он использует libgcrypt, вам потребуется настроить его блокировку перед использованием в многопоточной среде. Libgit2 не имеет прямого соединения с libgcrypt и поэтому не предоставляет удобных функций для него (хотя libgcrypt имеет макросы). Прочтите документацию libgcrypt по многопоточному использованию для получения дополнительной информации (http://www.gnupg.org/documentation/manuals/gcrypt/Multi-Threading.html).

Как автор программы или упаковщик, вы несёте ответственность за знание своих зависимостей и принятие необходимых мер для обеспечения безопасности многопоточного использования криптографических библиотек. Мы согласны, что эта ситуация далека от идеальной, но в настоящее время это то, с чем авторы программ должны иметь дело.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/fibjs-libgit2.git
git@api.gitlife.ru:oschina-mirror/fibjs-libgit2.git
oschina-mirror
fibjs-libgit2
fibjs-libgit2
main