Согласно собственным документам MaxMind, он безопасен только для потоков, если вы не используете опцию GEOIP_CHECK_CACHE.Это означает, что библиотека не будет проверять наличие обновлений базы данных на диске с помощью проверок mtime.Для долго работающего приложения, если вам нужны свежие данные, вам необходимо:
- Периодически перезапускать приложение
- Выполнять собственные проверки mtime и перезагружать через GeoIP_open () -введите вызовы, но для этого потребуется настроить собственный мьютекс для защиты перезагрузки / замены вашего общего дескриптора GeoIP, поэтому в этот момент вы выполняете полную защиту потока самостоятельно.Вы также можете включить GEOIP_CHECK_CACHE и использовать мьютекс, чтобы в первую очередь защитить все и избежать необходимости писать собственный код перезагрузки.
Две другие второстепенные функции также не являются поточно-ориентированными независимо от GEOIP_CHECK_CACHE:
- Если вы используете информацию о сетевой маске (а не все), функции поиска возвращают ее только путем установки gi-> netmask для самого дескриптора GeoIP, поэтому очевидно, что маска общего доступа общего дескриптора выиграла 't всегда дает правильные значения для «самого последнего» поиска из одного и того же потока.
- Очевидно, что любое использование интерфейсов итераторов для GeoIPCity (GeoIP_next_record ()) также будет небезопасным, так как состояние итератора сохраняетсяв общем дескрипторе.
Я мог бы пропустить другие проблемы в моем кратком анализе, но ИМХО более прагматично использовать либо дескриптор GeoIP для каждого потока, либо обернуть весь доступ к общему дескриптору самостоятельно.мьютекс, а затем вы можете использовать все функции и сделать это для перезагрузки на основе mtimeдля вас.