Compact Language Detector 2 的检测方法线程安全吗?

Is Compact Language Detector 2's detect method thread safe?

我们正在使用 Compact Language Detector 2 的 Java 包装器实现。

the detect() function 是线程安全的吗?

据我了解,它调用了 this library function

不,如果本机代码是使用 CLD2_DYNAMIC_MODE 集编译的,则它不是线程安全的,您可以使用函数 isDataDynamic().

对其进行测试

本机函数操作静态 class 变量 kScoringtables。如果在编译时定义了 CLD2_DYNAMIC_MODE,则此变量会初始化为一组空表 (NULL_TABLES),稍后可能会被其他线程加载或卸载动态数据。

kScoringtables.quadgram_obj 可能是非空的 at the line 1762 null check 然后 kScoringtables 地址在添加到跨线程之前被更改 ScoringContext对象在第 1777 行。在这种情况下,错误的指针将传递给第 1785 行的 ApplyHints,可能会导致第 1606 行发生不好的事情。

这将是一种非常罕见的竞争条件,但仍然有可能,并且它不是线程安全的,原因与标准 "lazy getter" 不是线程安全的原因相同。

要使此线程安全,您必须测试 isDataDynamic() returns 是否为假,或者确保 loadDataFromFileloadDataFromRawAddressunloadData 函数无法在您执行此方法时被不同的线程调用(或者至少直到您超过第 1777 行...)