当前位置: 首页 > 面试题库 >

Linux与FIFO等待队列的同步

龙俊德
2023-03-14
问题内容

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);
}


 类似资料:
  • 等待队列 到目前为止,我们的实验中,用户进程或内核线程还没有睡眠的支持机制。在课程中提到用户进程或内核线程可以转入等待状态以等待某个特定事件(比如睡眠,等待子进程结束,等待信号量等),当该事件发生时这些进程能够被再次唤醒。内核实现这一功能的一个底层支撑机制就是等待队列wait_queue,等待队列和每一个事件(睡眠结束、时钟到达、任务完成、资源可用等)联系起来。需要等待事件的进程在转入休眠状态后插

  • 等待队列接口 结构体 struct   rt_wqueue   等待队列控制块 更多...   struct   rt_wqueue_node   等待队列节点 更多...   宏定义 #define  RT_WQ_FLAG_CLEAN   0x00   等待队列清除   #define  RT_WQ_FLAG_WAKEUP   0x01   等待队列唤醒   #define  DEFINE_WA

  • 我们正在使用AMAZON SQS FIFO队列来处理我们应用程序的预约服务。一旦消息进入队列,它就会触发Amazon Lambda函数来管理预订过程。因为它是一个FIFO队列,所以我们确保如果有2个人请求相同的插槽,那么这个插槽将给第一个请求者。我的问题是:是否有一种方法(也许是SQS FIFO队列中的设置?)这确保了在前一条消息执行完毕之前,一条消息不会触发Amazon Lambda函数。我只是

  • 我已将FIFO队列作为目标添加到我们的自定义事件总线中。 当eventbridge连接到FIO队列时,需要MessageGroupId属性。 是否可以动态配置该值? 例如:我有一个FIFO队列,我把来自不同用户的事件。每个事件,在细节属性内,有一个属性uuid与用户标识符。我想使用这个属性,而不是e常量值作为MessageGroupId。这样,同一用户的所有事件都将按顺序处理。 谢谢你!

  • 我需要一个简单的FIFO实现的队列来存储一堆整数(我不介意它是泛型实现)。 在或Trove/Guava库中已经为我烘焙了什么?

  • 我们目前有一个接收大量传感器数据的应用程序。每个传感器都有其独特的传感器id('5834F7718273F92CC326F620')并以不同的间隔发出其状态。传入消息的处理顺序并不重要,例如,一个传感器的较新消息可以在另一个传感器的较旧消息之前处理。然而,重要的是,给定传感器的每个消息必须按顺序处理;按照他们到达溪流的顺序。 我查看了Kinesis客户端库,了解到KCL将消息按每个碎片推送到单个处