Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 是MaxMind';s GeoIP C实现线程安全?_Multithreading_Geolocation_Geoip - Fatal编程技术网

Multithreading 是MaxMind';s GeoIP C实现线程安全?

Multithreading 是MaxMind';s GeoIP C实现线程安全?,multithreading,geolocation,geoip,Multithreading,Geolocation,Geoip,假设一个进程在多个单独的线程中使用。由地址同时调用GeoIP\u record\u是否安全?假设这是唯一一个并发访问数据的进程,并且正在使用一个GeoIP句柄 提前谢谢 我有时间研究geoipapi,它对数据库的处理似乎是线程安全的。Pread或内存访问。根据MaxMind自己的文档,只有避免GEOIP\u CHECK\u CACHE选项,它才是线程安全的。这意味着库不会通过mtime检查来检查磁盘上的数据库更新。对于长时间运行的应用程序,如果需要新数据,则必须: 定期重新启动应用程序 执行您

假设一个进程在多个单独的线程中使用。由地址同时调用
GeoIP\u record\u是否安全?假设这是唯一一个并发访问数据的进程,并且正在使用一个GeoIP句柄


提前谢谢

我有时间研究geoipapi,它对数据库的处理似乎是线程安全的。Pread或内存访问。

根据MaxMind自己的文档,只有避免GEOIP\u CHECK\u CACHE选项,它才是线程安全的。这意味着库不会通过mtime检查来检查磁盘上的数据库更新。对于长时间运行的应用程序,如果需要新数据,则必须:

  • 定期重新启动应用程序
  • 执行您自己的mtime检查并通过 GeoIP_open()-类型调用,但这需要设置自己的调用 互斥以保护共享GeoIP的重新加载/替换 处理,所以在这一点上,你做的是全线程安全 保护自己。您还可以打开GEOIP_CHECK_CACHE,并使用互斥锁首先保护所有内容,避免编写自己的重新加载代码
不管GEOIP\u CHECK\u缓存如何,另外两个次要功能也不是线程安全的:

  • 如果您使用了网络掩码信息(并非所有人都使用),那么查找函数只能通过在GeoIP句柄本身上设置gi->netmask来返回该信息,因此很明显,共享句柄的网络掩码并不总是为来自同一线程的“最近”查找提供正确的值
  • 显然,对GeoIPCity使用迭代器接口(GeoIP_next_record())也是不安全的,因为迭代器状态存储在共享句柄中

在我的简要分析中,我可能遗漏了其他问题,但我认为,在每个线程中使用GeoIP句柄,或者将对共享句柄的所有访问都包装在您自己的互斥锁中,然后您可以使用所有功能并让它为您执行基于mtime的重新加载,这是更实际的做法。

您在线程之间共享单个GeoIP句柄吗?