MaxMind的GeoIP C实现线程安全吗?

时间:2011-12-05 16:44:17

标签: multithreading geolocation geoip

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

提前致谢!

2 个答案:

答案 0 :(得分:1)

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

  • 定期重启应用
  • 执行自己的mtime检查并重新加载 GeoIP_open() - 键入调用,但这需要设置自己的调用 互斥锁保护重新加载/替换您的共享GeoIP 处理,所以在那一点上你正在做完整的线程安全 保护你自己。您也可以打开GEOIP_CHECK_CACHE并使用互斥锁来保护所有内容,避免编写自己的重新加载代码。

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

  • 如果你使用网络掩码信息(而不是每个人都这样做),查找函数只能通过在GeoIP句柄本身上设置gi-> netmask来返回它,所以显然共享句柄的网络掩码并不总是给出正确的值来自同一线程的“最近”查询。
  • 显然,对GeoIPCity(GeoIP_next_record())使用迭代器接口也是不安全的,因为迭代器状态存储在共享句柄中。

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

答案 1 :(得分:0)

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