与FIFO等待队列的Linux同步

在等待队列是FIFO的Linux中是否有锁? 这似乎是这样一个明显的事情,但我刚刚发现,pthread互斥体不是先进先出,信号量显然也不是FIFO(我正在研究内核2.4(作业))…

Linux是否与FIFO等待队列locking,还是有一个简单的方法来使现有的机制之一?

这是一种建立在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); } 

如果你问我在想什么,你问的简短答案是否定的。 线程/进程由OS调度程序控制。 一个随机线程将获得锁,其他线程则不会。 那么,如果你正在使用计数信号量,可能不止一个,但这可能不是你所要求的。

你可能想看看pthread_setschedparam,但它不会让你怀疑你想去的地方。

你也许可以写一些东西,但是我怀疑它最终会变得效率低下,并且首先使用线程失败,因为你最终会随机产生每个线程,直到你想要的线程被控制。

机会很好,你只是以错误的方式思考问题。 你可能想描述你的目标,并得到更好的建议。