我目前正在阅读 APUE 这本书。当我阅读关于 pthread reader/writer-lock 的章节时,我有一个关于它使用 reader/writer-lock 实现并发队列的问题。
struct queue {
struct job *q_head;
struct job *q_tail;
pthread_rwlock_t q_lock;
};
/*
* Remove the given job from a queue.
*/
void
job_remove(struct queue *qp, struct job *jp)
{
pthread_rwlock_wrlock(&qp->q_lock);
if (jp == qp->q_head) {
qp->q_head = jp->j_next;
if (qp->q_tail == jp)
qp->q_tail = NULL;
else
jp->j_next->j_prev = jp->j_prev;
} else if (jp == qp->q_tail) {
qp->q_tail = jp->j_prev;
jp->j_prev->j_next = jp->j_next;
} else {
jp->j_prev->j_next = jp->j_next;
jp->j_next->j_prev = jp->j_prev;
}
pthread_rwlock_unlock(&qp->q_lock);
}
我的问题是这个实现如何确保 astruct job
只从链表中删除一次。据我了解,可以安排两个线程,使它们就在 line 之前pthread_rwlock_wrlock
。然后struct job *jp
可能会被释放两次。如果struct job *
是动态分配的数据结构,这可能会导致双重释放错误。有什么建议吗?