Linux同步与FIFO等待队列

标签 linux synchronization pthreads mutex semaphore

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/

相关文章:

java - 跨多个线程访问字符串

c - ubuntu 上的 sem_init 使用 C 语言

c - 使用内存泄漏的 pthread

linux - 如何在 Linux 中以名称 Bouvet-Island.png 递归复制同一目录中的所有文件 Norway.png

PHP与html混合无输出

linux - 备份数据库使用带日期功能的crontab

c++ - 为什么作者声称此代码会导致种族歧视?

QEMU 可以在 VMWare 或 VirtualBox 上运行吗?

javascript - 使 Meteor 方法调用在客户端同步

c - 取消线程后如何杀死所有使用 pthread_create 创建的子进程?