私は今APUEという本を読んでいます。pthread リーダー/ライター ロックに関する章を読んだときに、リーダー/ライター ロックを使用した同時キューの実装について質問があります。
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
がリンクされたリストから一度だけ削除されることをどのように保証できるかということです。私の理解では、ラインの直前に 2 つのスレッドをスケジュールできますpthread_rwlock_wrlock
。その後、struct job *jp
が 2 回解放される可能性があります。が動的に割り当てられたデータ構造である場合struct job *
、ダブルフリー バグが発生する可能性があります。何かアドバイス?