getaddrinfo_a线程安全吗?

时间:2014-08-18 12:30:50

标签: c linux multithreading posix

我想使用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;
}

1 个答案:

答案 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()函数应该是线程安全的。