我无法弄清楚我的信号量实现有什么问题

时间:2013-04-25 09:21:54

标签: c multithreading signals semaphore wait

我需要使用信号量在C89中实现生产者和消费者。

我承认这是为了学校作业,所以我将主要使用伪代码。

我花了很长时间来简化我的代码,所以希望有人能够找出问题所在

有一个全局变量:

threadQueue ready; //global queue that holds all the threads ready to be run

这些是我在代码中使用的函数。我试图让它们不言自明:

NewThread(Function); //turns a function into a thread
RotateQueue(Queue); //rotates the Queue so the head becomes the tail and next becomes the head
Add2Queue(Thread, Queue); //adds a thread to a queue
RunThread(NewThread); //stops the current thread, and runs NewThread
RemoveHead(Queue); //removes the head of the queue and returns it

以下是我设计信号量的方法:

struct semaphore{
    threadQueue queue;
    int val;
}

wait(semaphore s)
{
    if(--s.val < 0)
    {
        Add2Queue(currentThread, s.queue);
        RunThread(ready.head);
    }
}

signal(semaphore s)
{
    if(s.val++ < 0)
    {
        Add2Queue(removeHead(s.queue), ready);
    }
    RotateQueue(ready);
    RunThread(ready.head);
}

最后,这是我运行代码的地方:

semaphore mutex = 1;
semaphore taken = 0;
semaphore remaining = some number;

producer()
{
    while(1)
    {
        wait(remaining);
        wait(mutex);
        //critical section
        signal(mutex);
        signal(taken);
    }
}

consumer()
{
    while(1)
    {
        wait(taken);
        wait(mutex);
        //critical section
        signal(mutex);
        signal(remaining);
    }
}

main()
{
    thread produce = NewThread(producer);
    thread consume = NewThread(consumer);

    Add2Queue(produce, ready);
    Add2Queue(consume, ready);

    RunThread(ready.head);      
}

我的代码目前正在执行此操作:

  1. 开始制作线程
  2. 切换到信号后消耗线程(互斥)
  3. 开始使用线程
  4. 切换到第二个消费线程?等待(采取)
  5. 启动第二个帖子
  6. 切换到第三个消费线程?等待(采取)
  7. Add2Queue上的SegFaults
  8. 我很确定signal()和wait()不正确并导致我所有的问题,但我无法弄清楚我需要改变什么。

    请帮忙!

0 个答案:

没有答案