Является ли метод обнаружения языков Compact Language Detector 2 потокобезопасным? - PullRequest
0 голосов
/ 08 апреля 2020

Мы используем реализацию Java Wrapper Compact Language Detector 2 .

Является ли функция обнаружения () поточно-ориентированной?

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

1 Ответ

0 голосов
/ 18 апреля 2020

Нет, это не потокобезопасно, если нативный код был скомпилирован с набором 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 ...)

...