2011-12-05 2 views
0

프로세스가 많은 개별 스레드에서 MaxMind GeoIP C API을 사용한다고 가정합니다. GeoIP_record_by_addr에 대한 동시 통화는 안전합니까? 이것이 데이터에 동시에 액세스하는 유일한 프로세스이고 단일 GeoIP 핸들이 사용되고 있다고 가정합니다.MaxMind의 GeoIP C 구현 스레드 안전합니까?

미리 감사드립니다.

+0

스레드간에 단일 geoip 핸들을 공유하고 있습니까? – pilcrow

+0

예. 그것을 반영하기 위해 편집 됨. – Sam

답변

1

MaxMind의 자체 문서에 따르면 GEOIP_CHECK_CACHE 옵션을 사용하지 않으면 스레드로부터 안전합니다. 즉, 라이브러리는 mtime 검사를 통해 디스크의 데이터베이스 업데이트를 확인하지 않습니다.

  • 다시 시작 앱이 주기적으로
  • 이 GeoIP_open() 자신의 mtime에 검사를 수행하고 를 통해 다시로드 - 유형의 통화를하지만,이 : 당신이 새 데이터를 원하는 경우 장기 실행 응용 프로그램의 경우, 당신도 할 것이다 공유 GeoIP 핸들의 다시로드/교체를 보호하기 위해 자신의 뮤텍스를 설정해야하므로 그 시점에서 완전한 스레드 안전 보호를 직접 수행해야합니다. GEOIP_CHECK_CACHE를 켜고 뮤텍스를 사용하여 처음부터 모든 것을 보호하고 자체 재로드 코드를 작성하지 않아도됩니다.

다른 두 가지 사소한 기능도 GEOIP_CHECK_CACHE에 관계없이 스레드 안전하지 않습니다 :

  • 는 넷 마스크 정보의 사용 (그리고 모두가 않습니다) 조회 기능은 GI- 설정하여 있음을 반환 한 경우 > Netmask를 GeoIP 자체에서 처리하므로 분명히 공유 핸들의 넷 마스크가 같은 스레드의 "최근"조회에 대해 올바른 값을 제공하지는 않습니다.
  • 분명히 GeoIPCity (GeoIP_next_record())에 대한 반복기 인터페이스의 사용은 반복자 상태가 공유 핸들에 저장되기 때문에 안전하지 않을 수 있습니다.

내 간략한 분석에 다른 문제가 누락 될 수 있지만, 그것은 더 실용적입니다 이럴 중 하나 GeoIP가 핸들을 사용하여 스레드 당하거나 자신의 뮤텍스에 공유 핸들에 대한 모든 액세스를 포장 한 다음 모두 사용할 수 있습니다 기능을 사용하고 mtime 기반의 다시로드 작업을 수행해야합니다.

0

GeoIP API를 조사 할 시간이 있었으며 데이터베이스의 처리가 스레드로부터 안전함이 나타났습니다. Pread 또는 메모리 액세스.