Семафоры, использующие 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 до того, как какие-либо элементы будут израсходованы, а затем происходит сбой.
Есть идеи?