当前位置: 技术问答>linux和unix
unix环境高级编程 线程同步这章 源代码的问题??
来源: 互联网 发布时间:2016-07-01
本文导语: struct foo * foo_alloc(void) /* allocate the object */ { struct foo *fp; int idx; if ((fp = malloc(sizeof(struct foo))) != NULL) { fp->f_count = 1; if (pthread_mutex_init(&fp->f_lock, NULL)...
struct foo *
foo_alloc(void) /* allocate the object */
{
struct foo *fp;
int idx;
if ((fp = malloc(sizeof(struct foo))) != NULL) {
fp->f_count = 1;
if (pthread_mutex_init(&fp->f_lock, NULL) != 0) {
free(fp);
return(NULL);
}
idx = HASH(fp);
pthread_mutex_lock(&hashlock);
fp->f_next = fh[idx];
fh[idx] = fp->f_next;
pthread_mutex_lock(&fp->f_lock);
pthread_mutex_unlock(&hashlock);
/* ... continue initialization ... */
pthread_mutex_unlock(&fp->f_lock);
}
return(fp);
}
以上就是源码的片段, 但我不明白
pthread_mutex_lock(&fp->f_lock);
pthread_mutex_unlock(&hashlock);
pthread_mutex_unlock(&fp->f_lock);
为什么要怎么写,还没等hashlock解锁,就给&fp->f_lock加锁,而且还怎么都不做就解锁了,这个实例是避免死锁了实例片段。请高手帮我分析分析呗!!!!!谢谢!!
foo_alloc(void) /* allocate the object */
{
struct foo *fp;
int idx;
if ((fp = malloc(sizeof(struct foo))) != NULL) {
fp->f_count = 1;
if (pthread_mutex_init(&fp->f_lock, NULL) != 0) {
free(fp);
return(NULL);
}
idx = HASH(fp);
pthread_mutex_lock(&hashlock);
fp->f_next = fh[idx];
fh[idx] = fp->f_next;
pthread_mutex_lock(&fp->f_lock);
pthread_mutex_unlock(&hashlock);
/* ... continue initialization ... */
pthread_mutex_unlock(&fp->f_lock);
}
return(fp);
}
以上就是源码的片段, 但我不明白
pthread_mutex_lock(&fp->f_lock);
pthread_mutex_unlock(&hashlock);
pthread_mutex_unlock(&fp->f_lock);
为什么要怎么写,还没等hashlock解锁,就给&fp->f_lock加锁,而且还怎么都不做就解锁了,这个实例是避免死锁了实例片段。请高手帮我分析分析呗!!!!!谢谢!!
|
第一个问题书上有解释吧。
pthread_mutex_lock(&hashlock);
fp->f_next = fh[idx];
fh[idx] = fp->f_next;
到这一步把新的结点加到全局的hash表中。此时新的结点对其它线程来说是可见的。
如果下一步是
pthread_mutex_unlock(&hashlock);
解锁后,其它线程可以取得该结点并进行其它一些操作。但是该结点并没初始化完就
被其它线程使用,有违背题目的意思。因此特意在解锁之前锁住另一个锁,避免其它
线程对该结点的其它数据进行修改。
第二个问题似乎是书上的问题:
fp->f_next = fh[idx];
fh[idx] = fp->f_next;
题目意思是把fp加入这个链表中。
感觉应该是:
fp->f_next = fh[idx];
fh[idx] = fp;
pthread_mutex_lock(&hashlock);
fp->f_next = fh[idx];
fh[idx] = fp->f_next;
到这一步把新的结点加到全局的hash表中。此时新的结点对其它线程来说是可见的。
如果下一步是
pthread_mutex_unlock(&hashlock);
解锁后,其它线程可以取得该结点并进行其它一些操作。但是该结点并没初始化完就
被其它线程使用,有违背题目的意思。因此特意在解锁之前锁住另一个锁,避免其它
线程对该结点的其它数据进行修改。
第二个问题似乎是书上的问题:
fp->f_next = fh[idx];
fh[idx] = fp->f_next;
题目意思是把fp加入这个链表中。
感觉应该是:
fp->f_next = fh[idx];
fh[idx] = fp;