Есть ли привязывает 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);
}
Если вы спрашиваете, о чем я думаю, вы спрашиваете, краткий ответ - нет. Потоки / процессы контролируются планировщиком ОС. Один случайный поток получит блокировку, остальные - нет. Ну, потенциально может быть больше одного, если вы используете счетный семафор, но, вероятно, вы не об этом спрашиваете.
Вы можете посмотреть pthread_setschedparam , но он не приведет вас туда, куда, я подозреваю, вы хотите.
Вы, вероятно, могли бы написать что-нибудь, но я подозреваю, что в конечном итоге это окажется неэффективным и в первую очередь откажется от использования потоков, так как в конечном итоге вы просто будете случайным образом выдавать каждый поток, пока тот, который вам нужен, не получит контроль.
Скорее всего, вы просто неправильно думаете о проблеме. Вы можете описать свою цель и получить более точные предложения.