Семафоры, использующие ucontext.h

В основном я провел 15 часов без сна, пытаясь выяснить семафоры. Может кто-нибудь объяснить мне, что не так с моим текущим кодом? Я считаю, что моя проблема с P(). Я не могу понять, как правильно блокировать и менять местами.

Это было для домашней работы, но срок истек, и я просто хочу выяснить это.

Вот мой код:

AddQueue(head, node); //adds a node to a queue

void P(semaphore_t *sem)
{
    if (--sem->value < 0) 
    {
        //runQ is the Queue that holds threads that are ready to be executed
        Queue *temp = DeleteQueue(&runQ); //deletes and returns the head
        AddQueue(&(sem->tcb), temp);    
        swapcontext(&(temp->context), &(runQ->context));
    }
}

void V(semaphore_t *sem)
{
    if (sem->value++ < 0)
    {           
        AddQueue(&runQ, DeleteQueue(&(sem->tcb)));
    }
    yield(); //this function rotates the queue and runs the new head thread     
}

Таким образом, этот код вызывает ошибки в программе производителя / потребителя, которую я написал для тестирования. Я установил размер буфера равным 4, и производитель создает элемент 5 до того, как какие-либо элементы будут израсходованы, а затем происходит сбой.

Есть идеи?

0 ответов

Другие вопросы по тегам