Linux中有等待队列为FIFO的锁吗?这似乎是一件显而易见的事情,但是我刚刚发现pthread互斥锁不是FIFO,信号量显然也不是FIFO(我正在研究内核2.4(家庭作业))…
Linux是否具有带有FIFO等待队列的锁,或者是否有简单的方法可以利用现有机制来建立锁?
这是创建基于pthreads原语的简单排队“票证锁”的方法。它应该给您一些想法:
#include <pthread.h> typedef struct ticket_lock { pthread_cond_t cond; pthread_mutex_t mutex; unsigned long queue_head, queue_tail; } ticket_lock_t; #define TICKET_LOCK_INITIALIZER { PTHREAD_COND_INITIALIZER, PTHREAD_MUTEX_INITIALIZER } void ticket_lock(ticket_lock_t *ticket) { unsigned long queue_me; pthread_mutex_lock(&ticket->mutex); queue_me = ticket->queue_tail++; while (queue_me != ticket->queue_head) { pthread_cond_wait(&ticket->cond, &ticket->mutex); } pthread_mutex_unlock(&ticket->mutex); } void ticket_unlock(ticket_lock_t *ticket) { pthread_mutex_lock(&ticket->mutex); ticket->queue_head++; pthread_cond_broadcast(&ticket->cond); pthread_mutex_unlock(&ticket->mutex); }