Синхронизация Linux с очередью ожидания FIFO

Есть ли привязывает Linux, где ожидающая очередь является FIFO? Это походит на такую очевидную вещь, и все же я просто обнаружил, что pthread взаимные исключения не являются FIFO, и семафоры, по-видимому, не являются FIFO ни один (я работаю над ядром 2.4 (домашняя работа))...

Linux имеет блокировку с очередью ожидания FIFO или является там простым способом сделать один с существующими механизмами?

5
задан EpsilonVector 16 June 2010 в 00:58
поделиться

2 ответа

Вот способ создания простой очереди "блокировки билетов", построенной на примитивах 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);
}
4
ответ дан 14 December 2019 в 04:30
поделиться

Если вы спрашиваете, о чем я думаю, вы спрашиваете, краткий ответ - нет. Потоки / процессы контролируются планировщиком ОС. Один случайный поток получит блокировку, остальные - нет. Ну, потенциально может быть больше одного, если вы используете счетный семафор, но, вероятно, вы не об этом спрашиваете.

Вы можете посмотреть pthread_setschedparam , но он не приведет вас туда, куда, я подозреваю, вы хотите.

Вы, вероятно, могли бы написать что-нибудь, но я подозреваю, что в конечном итоге это окажется неэффективным и в первую очередь откажется от использования потоков, так как в конечном итоге вы просто будете случайным образом выдавать каждый поток, пока тот, который вам нужен, не получит контроль.

Скорее всего, вы просто неправильно думаете о проблеме. Вы можете описать свою цель и получить более точные предложения.

4
ответ дан 14 December 2019 в 04:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: