Cで複数の生産者/消費者問題を試みていますが、期待どおりに機能していません。以下は、私の実装を表すためのいくつかの擬似コードです。
Thread thread1;
Thread thread2;
Thread thread3;
Data data1;
Mutex data1_mutex;
Semaphore data1_empty;
Semaphore data1_fill;
Data data2;
Mutex data2_mutex;
Semaphore data2_empty;
Semaphore data2_fill;
thread1()
{
// creates data and places it into data1.
wait(data1_empty);
lock(data1_mutex);
// critical section
unlock(data1_mutex);
post(data1_fill);
}
thread2()
{
// Removes data from data1, processes it, and places it into data2.
// data1
wait(data1_fill);
lock(data1_mutex);
// data2
wait(data2_empty);
lock(data2_mutex);
// critical section
// data2
unlock(data2_mutex);
post(data2_fill);
// data1
unlock(data1_mutex);
post(data1_empty);
}
thread3()
{
// Removes data from data2, prints its results, and removes it.
wait(data2_fill);
lock(data2_mutex);
// critical section
unlock(data2_mutex);
post(data2_empty);
}
ただし、このソリューションではdata1がいっぱいになりますが、thread2はロックされ、実行されません。私の実装に何か問題がありますか?
編集#1
私が見つけた問題の1つは、2番目のミューテックスが正しく作成されていなかったことです。何が問題なのかわからないので、すべてのスレッドに最初のミューテックスを使用しています。それを機能させるために私が行った他のこともあるので、後でこれを反映するように擬似コードを更新します。