c++ - Word-Net线程安全

标签 c++ multithreading

我正在使用 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 表示成功。

有什么办法可以:

  1. 在这种情况下确保线程安全,或者
  2. 找出(通过任何可能的方式)库是否是线程安全的?

它是动态加载的,来自一个名为 wordnet-base 的 Debian 软件包,它安装了 libwordnet-3.0.so

非常感谢任何可以提供帮助的人!

最佳答案

嗯,确保库真正线程安全的唯一方法是分析它的代码。或者简单地询问其作者,然后相信他/她的回答:)。通常存储在磁盘上的数据不是线程不安全的原因,但在多线程环境中有很多地方代码可能会中断。必须检查全局变量、库函数中是否存在声明为 static 的变量等。

但是,如果您没有时间和/或没有意图研究代码,可以使用一个解决方案。当并行任务在工作进程而不是工作线程中执行时,您可以使用多进程技术,并且有一个指导进程为工作人员准备工作单元并收集结果。根据任务的不同,这些工作人员可以实现为 FastCGI ,或使用 Boost.Interprocess 与家长沟通

关于c++ - Word-Net线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21518781/

相关文章:

c++ - 使用 pacman 从 msys2 安装的库构建应用程序

ios - 作为其他 MOC 的子项创建的 MOC 是否也会包含未保存的更改?

c++ - OpenMP 不支持循环中断

c++ - 如何同时满足 gcc4.1.2 和 gcc 4.7.3

c++ - 等待信号量的进程调度

c++ - 如何在 C++ 中通过另一个索引数组重新排列一个数组

c++ - OpenCV 中的圆圈和手部检测

ios - RestKit 完成 block 是否在主 UI 线程上运行?

java - 在awaitConfimation之后关闭Executor线程

java - ConcurrentHashMap线程安全