Нет, это не потокобезопасно, если нативный код был скомпилирован с набором CLD2_DYNAMIC_MODE
, который можно проверить с помощью функции isDataDynamic()
.
Нативная функция манипулирует переменной класса stati c kScoringtables
. Если CLD2_DYNAMIC_MODE
определено при компиляции, эта переменная инициализируется набором пустых таблиц (NULL_TABLES
) и может позже быть загружена с динамическими данными c или выгружена, возможно, другими потоками.
Было бы возможно, чтобы kScoringtables.quadgram_obj
был ненулевым в строке 1762, проверка нуля , а затем адрес kScoringtables
изменился до того, как он был добавлен к объекту ScoringContext
с перекрестными потоками в строке 1777. В этом случае неправильный указатель будет передан в ApplyHints
в строке 1785, что может привести к возникновению плохих событий в строке 1606.
Это будет очень редкое состояние гонки, но, тем не менее, возможно и не потокобезопасен по той же причине, что стандартный "ленивый получатель" не является потокобезопасным.
Чтобы сделать этот потокобезопасным, вам придется либо проверить, что isDataDynamic()
возвращает false, либо убедиться, что loadDataFromFile
, loadDataFromRawAddress
и unloadData
функции не могут быть вызваны другим потоком, пока вы выполняете этот метод (или, по крайней мере, пока не закончите строку 1777 ...)