2011-12-05 36 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檢查來檢查磁盤上的數據庫更新。對於長時間運行的應用程序,如果你想新的數據你就必須要麼:

  • 重新啓動應用程序定期
  • 做你自己的mtime檢查,並通過 重裝GeoIP_open() - 呼叫類型,但是這將需要設置您自己的 互斥鎖來保護您的共享GeoIP 手柄的重新加載/更換,因此此時您將自行完成全線程安全 保護。您最好打開GEOIP_CHECK_CACHE並使用互斥鎖來保護所有內容,並避免編寫自己的重載代碼。其他

兩個小功能也不是線程安全的,無論GEOIP_CHECK_CACHE的:

  • 如果您使用的網絡掩碼信息(而不是每個人都一樣),查找函數只返回設置GI- > GeoIP句柄本身的網絡掩碼,顯然共享句柄的網絡掩碼並不總是爲來自同一個線程的「最近期」查找提供正確的值。
  • 很顯然,GeoIPCity(GeoIP_next_record())的任何迭代器接口的使用也是不安全的,因爲迭代器狀態存儲在共享句柄中。

我可能會錯過其他的問題,我簡要的分析,但恕我直言,這是更加務實要麼使用GeoIP的手柄每個線程或包裹在自己的互斥鎖的所有訪問共享手柄,然後你可以使用所有功能,並讓它爲您執行基於mtime的重新加載。

0

我有時間調查GeoIP API,看起來它對數據庫的處理是線程安全的。預讀或內存訪問。