Linux与FIFO等待队列同步

Eps*_*tor 5 linux synchronization mutex semaphore pthreads

在Linux中有等待队列是FIFO的锁吗?这看起来很明显,但我发现pthread互斥量不是FIFO,信号量显然也不是FIFO(我正在研究内核2.4(家庭作业))...

Linux是否具有FIFO等待队列的锁定,或者是否有一种简单的方法可以使用现有机制制作一个?

caf*_*caf 5

这是一种创建简单排队“票据锁”的方法,基于 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);
}
Run Code Online (Sandbox Code Playgroud)