2011-12-05 9 views
0

プロセスが多くの別々のスレッドでMaxMind GeoIP C APIを使用しているとします。 GeoIP_record_by_addrへの同時呼び出しは安全ですか?これがデータに同時にアクセスする唯一のプロセスであり、単一のGeoIPハンドルが使用されているとします。MaxMindのGeoIP C実装スレッドセーフですか?

ありがとうございます!

+0

スレッド間で1つのジオープハンドルを共有していますか? – pilcrow

+0

はい。それを反映するように編集されました。 – Sam

答えて

1

MaxMind独自のドキュメントによると、GEOIP_CHECK_CACHEオプションを避けた場合にのみ、スレッドセーフです。つまり、ライブラリはmtimeチェックを介してディスク上のデータベース更新をチェックしません。長時間実行中のアプリケーションのために、あなたが新鮮なデータが必要な場合は、どちらかにあります:

  • を再起動し、定期的に
  • 独自のmtimeのチェックを行うと GeoIP_open()を経由してリロードアプリ - 型のコールが、この共有GeoIP ハンドルの再読み込み/置換を保護するために独自の ミューテックスを設定する必要があります。その時点で完全なスレッドセーフ の保護を自分で行っています。 GEOIP_CHECK_CACHEをオンにして、ミューテックスを使用して最初のすべてを保護し、独自のリロードコードを書く必要がなくなります。

    • をあなたが(とは誰もが行う)ネットマスクの情報を利用する場合は、ルックアップ機能のみGI-を設定することであることを返します。他の二つのマイナーな機能もかかわらずGEOIP_CHECK_CACHEのスレッドセーフではありません

    > NetmaskをGeoIPハンドル自体に追加するので、共有ハンドルのネットマスクは、同じスレッドからの「最新の」ルックアップに対して常に正しい値を与えるとは限りません。

  • GeoIPCity(GeoIP_next_record())のイテレータインターフェイスは、イテレータの状態が共有ハンドルに格納されているため、安全ではありません。

私は私の簡単な分析で他の問題を逃したが、私見それはスレッドごとののGeoIPハンドルを使用するか、または独自のミューテックスで共有ハンドルへのすべてのアクセスをラップのいずれかに、より実用的だし、あなたはすべてを使用することができますすることができあなたのためにmtimeベースのリロードを行うことができます。

0

私はGeoIP APIを調査する時間があり、データベースの処理はスレッドセーフであるようです。プリアイドまたはメモリアクセス。

関連する問題