我正在尝试 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
我发现的问题之一是我的第二个互斥锁没有正确创建。我不知道它有什么问题,所以我只是对所有线程使用第一个互斥锁。为了让它正常工作,我还做了一些其他的事情,所以稍后我会更新我的伪代码以反映这一点。