我正在使用 Word-Net在 C++ 项目中(尽管库在 C 中)。具体来说,我只调用了两个函数:
findtheinfo_ds
traceptrs_ds
现在,如果我正确理解底层结构(我认为它是九十年代后期写的,它已经很老了),库使用文件作为数据库,从中检索我得到的缓冲区结果。
但是,我不确定库的线程安全性。
我目前的算法是:
SynsetPtr syn = findtheinfo_ds( query , NOUN, HYPERPTR, ALLSENSES );
if ( syn )
{
// Iterate all senses
while ( syn )
{
for ( int i = 0; i < syn->wcount; i++ )
std::cout << "synonym: " << syn->words[i] << std::endl;
int i = 0;
SynsetPtr ptr = traceptrs_ds( syn, HYPERPTR, NOUN, 1 );
while ( ptr )
{
for ( int x = 0; x <= i; x++ )
std::cout << "\t";
for ( int i = 0; i < ptr->wcount; i++ )
std::cout << ptr->words[i] << ", ";
std::cout << std::endl;
i++;
auto old_ptr = ptr;
ptr = traceptrs_ds( ptr, HYPERPTR, NOUN, 1 );
free_syns( old_ptr );
}
free_syns( ptr );
syn = syn->nextss;
}
free_syns( syn );
}
}
但是,我想运行并行线程,同时搜索不同的词。 我知道当今大多数 UNIX/Linux 发行版都有线程安全的文件系统调用。
此外,我打算仅针对每个线程访问上述循环。
我担心的是,在上面这个循环之前,一个
wninit();
调用必须发生,这让我假设在库中,一个单例在某处被初始化。我无法查看代码,因为它是封闭源代码,而且我无权访问该单例,因为 winit() 仅返回一个 int 表示成功。
有什么办法可以:
- 在这种情况下确保线程安全,或者
- 找出(通过任何可能的方式)库是否是线程安全的?
它是动态加载的,来自一个名为 wordnet-base 的 Debian 软件包,它安装了 libwordnet-3.0.so
非常感谢任何可以提供帮助的人!
最佳答案
嗯,确保库真正线程安全的唯一方法是分析它的代码。或者简单地询问其作者,然后相信他/她的回答:)。通常存储在磁盘上的数据不是线程不安全的原因,但在多线程环境中有很多地方代码可能会中断。必须检查全局变量、库函数中是否存在声明为 static
的变量等。
但是,如果您没有时间和/或没有意图研究代码,可以使用一个解决方案。当并行任务在工作进程而不是工作线程中执行时,您可以使用多进程技术,并且有一个指导进程为工作人员准备工作单元并收集结果。根据任务的不同,这些工作人员可以实现为 FastCGI
,或使用 Boost.Interprocess
与家长沟通
关于c++ - Word-Net线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21518781/