多线程编程指南

提供静态局部变量

示例 9–2 说明了与 errno 问题类似的问题,但涉及的是静态存储,而不是全局存储。函数 gethostbyname(3NSL) 是将计算机名称作为其参数进行调用的。返回值是一个指向结构的指针,该结构包含通过网络通信联系计算机所需的信息。


示例 9–2 gethostbyname() 问题

struct hostent *gethostbyname(char *name) {

    static struct hostent result;

        /* Lookup name in hosts database */

        /* Put answer in result */

    return(&result);

}

通常情况下,使用返回到局部变量的指针不是一个好办法。在本示例中使用指针有效,是因为变量是静态的。但是,当两个线程同时使用不同的计算机名称调用此变量时,使用静态存储会发生冲突。

errno 问题一样,可以使用线程特定数据来替换静态存储。但是,此替换涉及到动态分配存储,并且会增加调用开支。

处理该问题的更好方法是使 gethostbyname() 的调用方为调用结果提供存储。调用方可通过例程的其他输出参数来提供存储。其他输出参数需要 gethostbyname() 函数的新接口。

在线程中常使用此技术来解决许多问题。在大多数情况下,新接口的名称就是原有名称附加 "_r",如 gethostbyname_r(3NSL)