Если не указано иное, объекты libgit2 нельзя безопасно использовать одновременно несколькими потоками.
Существуют также ограничения, связанные с использованием криптографических библиотек, используемых libgit2 или его зависимостей (более подробно об этом ниже). Если вы учтите следующие моменты, проблем возникнуть не должно:
Используйте объект из одного потока за раз. Большинство данных не защищены от параллельного доступа самостоятельно. Это потому что они редко используются в изоляции, а значит имеет смысл синхронизировать доступ через более крупный замок или аналогичный механизм.
Некоторые объекты являются только для чтения/неизменяемыми и поэтому безопасны для использования несколькими потоками, такими как ссылки и снимки конфигурации.
Объект git_odb
использует внутреннее блокирование и является многопоточно-безопасным для использования из нескольких потоков одновременно.
git_error_last()
должен происходить в том же потоке, где произошла ошибка, чтобы получить сообщение. Часто это будет случай независимо от этого, но если вы используете что-то вроде GCD на macOS (где код выполняется на произвольном потоке), код должен гарантировать получение кода ошибки в потоке, где она произошла.Многопоточность и криптографические библиотекиКогда сборка производится как нативный DLL Windows, libgit2 использует WinCNG и WinHTTP, оба которых являются многопоточно-безопасными. Вам ничего специального делать не нужно.
При использовании libssh2, который сам использует WinCNG, нет необходимости выполнять какие-либо специальные шаги. Если вы используете среду MinGW или подобную, где libssh2 использует OpenSSL или libgcrypt, то общая ситуация затрагивает вас.
По умолчанию мы используем 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 )