Я пытаюсь решить проблему с множеством производителей / потребителей в 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);
}
Однако, с этим решением данные1 будут заполняться, но поток 2 будет блокироваться и никогда не будет работать. Что-то не так с моей реализацией?
РЕДАКТИРОВАТЬ # 1
Одна из проблем, которые я обнаружил, заключалась в том, что мой второй мьютекс создавался неправильно. Я не знаю, что с ним не так, поэтому я просто использую первый мьютекс для всех потоков. Есть еще кое-что, что я сделал, чтобы заставить его работать, поэтому я обновлю свой псевдокод, чтобы отразить это позже, когда у меня будет минута.