セマフォを使用して、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);
}
私のコードは現在これを行っています:
- プロデュース スレッドを開始します
- シグナルの後にスレッドを消費するように切り替えます(mutex)
- スレッドの消費を開始します
- 2 番目の消費スレッドに切り替えますか? 待機中(撮影済み)
- 2 番目のスレッドを開始します
- 3 番目の消費スレッドに切り替えますか?? 待機中(撮影済み)
- Add2Queue の SegFault
signal() と wait() が正しくなく、すべての問題を引き起こしていると確信していますが、何を変更する必要があるのか わかりません。
助けてください!