1

セマフォを使用して、C89 でプロデューサーとコンシューマーを実装する必要があります。

これは学校の課題であることを認めますので、主に疑似コードを使用します。

コードを単純化するのに永遠にかかったので、誰かが何が間違っているかを理解できることを願っています

1 つのグローバル変数があります。

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. シグナルの後にスレッドを消費するように切り替えます(mutex)
  3. スレッドの消費を開始します
  4. 2 番目の消費スレッドに切り替えますか? 待機中(撮影済み)
  5. 2 番目のスレッドを開始します
  6. 3 番目の消費スレッドに切り替えますか?? 待機中(撮影済み)
  7. Add2Queue の SegFault

signal() と wait() が正しくなく、すべての問題を引き起こしていると確信していますが、何を変更する必要があるのか​​ わかりません。

助けてください!

4

0 に答える 0