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);
}
关于Linux同步与FIFO等待队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3050083/