家庭作业汇总

12.26 用加锁—拷贝技术实现gethostbyname的一个线程安全又不可重入的版本,称之为gethostbyname-ts。

某些函数(如gethostbyname)将计算结果放在静态结构中,并返回一个指向这个结构的指针。如果我们从并发线程中调用这些函数,那么将可能发生灾难,因为正在被一个线程使用的结果会被另一个线程悄悄地覆盖了。

有两种方法来处理这类线程不安全函数。一种是选择重写函数,使得调用者传递存放结果的结构地址。这就消除了所有共享数据,但是它要求程序员还要改写调用者的代码。

如果线程不安全函数是难以修改或不可修改的(例如,它是从一个库中链接过来的),那么另外一种选择就是使用lock-and-copy(加锁-拷贝)技术。这个概念将线程不安全函数与互斥锁联系起来。在每个调用位置,对互斥锁加锁,调用函数不安全函数,动态地为结果非配存储器,拷贝函数返回的结果到这个存储器位置,然后对互斥锁解锁。一个吸引人的变化是定义了一个线程安全的封装(wrapper)函数,它执行lock-and-copy,然后调用这个封转函数来取代所有线程不安全的函数。例如下面的gethostbyname的线程安全函数。

struct hostent* gethostbyname_ts(char* host)
{
struct hostent* shared, * unsharedp;
unsharedp = Malloc(sizeof(struct hostent));
P(&mutex)
shared = gethostbyname(hostname);
*unsharedp = * shared;
V(&mutex);
return unsharedp;
}

三分题:20135237朱国庆2分,20135221黄卫4分

2.92遵循位级浮点数编码规则,实现具有以下原型的函数“
float_bits float_negate(float_bits f);
对于浮点数f,这个函数计算-f.如果f是NAN,你的函数应该简单地返回f.
测试你的浮点数

测试结果:

2分:20135237朱国庆2分

总分:20135237朱国庆四分。

posted on 2015-12-15 21:35  20135237朱国庆  阅读(438)  评论(0编辑  收藏  举报