基本上我花了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项,然后崩溃。
有什么想法吗?