我想使用getaddrinfo_a函数。这个方法线程安全吗? 在手册页示例中,使用全局列表来解析主机名。 如果我在用户空间中操作该列表,那么它是否安全? 伪代码如下:
static struct gaicb **reqs =NULL; // global list of hostname to resolve.
addToList() {
ret =
getaddrinfo_a(
GAI_NOWAIT,
&reqs[nreqs_base],
nreqs - nreqs_base,
NULL ); // enque hostname queue.
}
//another thread method
dequeu_list( int i ) {
struct gaicb * result = reqs[i] ;
reqs[i] = NULL;
}
答案 0 :(得分:5)
是的,请参阅source code:
...
int
getaddrinfo_a (int mode, struct gaicb *list[], int ent, struct sigevent *sig)
{
...
no acess to list
...
/* Request the mutex. */
pthread_mutex_lock (&__gai_requests_mutex);
/* Now we can enqueue all requests. Since we already acquired the
mutex the enqueue function need not do this. */
for (cnt = 0; cnt < ent; ++cnt)
if (list[cnt] != NULL)
{
...
在访问list
之前获取互斥锁。
无论如何,它与getaddrinfo
类似,required是线程安全的:
freeaddrinfo()
和getaddrinfo()
函数应该是线程安全的。