2010-08-23 108 views
2

是res_query(int res_query(const char *dname, int class, int type,unsigned char *answer, int anslen);)是线程安全的?是res_query线程安全的?

我是这么认为的,因为它的答案写到一个用户分配的缓冲区(对比的gethostbyname使用静态分配的缓冲区)。

是否有人知道肯定?

+0

[似乎不是MT安全](http://www.google.com/search?hl=zh-CN&safe=off&q=linux+res_query+multi+threaded&aq=f&aqi=&aql=&oq=&gs_rfai=) – Dummy00001 2010-08-23 15:39:03

+0

@ Dummy00001:只有一个命中,有人声称res_query不是线程安全的,因为它会覆盖内部配置变量_res。我在BIND邮件列表中发现了一些较早的讨论(从2002年开始)(libresolv,因此res_query是BIND的一部分),_res应该是线程本地的,所以我认为他们已经在多年前实现了。 – IanH 2010-08-23 19:57:55

+0

顺便说一句,[libevent的](http://monkey.org/~provos/libevent/)通告为(异步)名称解析的支持。我敢打赌,他们有关于MT安全性的更好文档。祝你好运。 – Dummy00001 2010-08-23 20:49:55

回答

1

你是正确的,res_query不是线程安全的。你必须使用res_nquery,它首先接受'res_state'参数。从我读过的所有内容来看,应该如何以线程安全的方式完成查询。