1

假设一个进程在许多单独的线程中使用MaxMind GeoIP C API 。并发调用GeoIP_record_by_addr安全吗?假设这是唯一同时访问数据的进程,并且正在使用单个 GeoIP 句柄。

提前致谢!

4

2 回答 2

2

根据 MaxMind 自己的文档,如果您避免使用 GEOIP_CHECK_CACHE 选项,它只是线程安全的。这意味着库不会通过 mtime 检查检查磁盘上的数据库更新。对于长期运行的应用程序,如果您需要新鲜数据,您必须:

  • 定期重启应用
  • 通过 GeoIP_open() 类型调用进行自己的 mtime 检查和重新加载,但这需要设置自己的互斥锁以保护共享 GeoIP 句柄的重新加载/替换,因此此时您正在执行完整的线程安全保护靠自己。您也可以打开 GEOIP_CHECK_CACHE 并使用互斥锁来保护所有内容,避免编写自己的重新加载代码。

无论 GEOIP_CHECK_CACHE 如何,另外两个次要功能也不是线程安全的:

  • 如果您使用网络掩码信息(并不是每个人都这样做),则查找函数仅通过在 GeoIP 句柄本身上设置 gi->netmask 来返回该信息,因此显然共享句柄的网络掩码不会总是为“最近" 从同一个线程中查找。
  • 显然,对 GeoIPCity (GeoIP_next_record()) 的迭代器接口的任何使用也是不安全的,因为迭代器状态存储在共享句柄中。

在我的简短分析中我可能遗漏了其他问题,但恕我直言,使用每个线程的 GeoIP 句柄或将所有对共享句柄的访问包装在您自己的互斥锁中更为实用,然后您可以使用所有功能并让它去做为您提供基于 mtime 的重新加载。

于 2013-01-16T15:08:56.600 回答
0

我有时间调查 GeoIP API,看来它对数据库的处理是线程安全的。预读或内存访问。

于 2011-12-12T03:24:03.263 回答