У меня есть университетское задание, где я должен использовать потоки для выполнения некоторых вычислений. Это сводится к одному потребителю с несколькими производителями -> каждый производитель делает один расчет, потребитель добавляет все это вместе.C - Pthreads, один потребитель, синхронизация нескольких производителей
У меня возникли проблемы с синхронизацией этого, чтобы производитель перешел в его критическую секцию всякий раз, когда потребитель вычислил свою часть и вышел из своей критической секции.
Вот код, который я до сих пор:
ПОТРЕБИТЕЛЕЙ
do
{
pthread_mutex_lock(&mutex);
pthread_cond_wait(&consumer, &mutex);
/*Do some stuff*/
pthread_mutex_unlock(&mutex);
count++;
} while(count < m); /*Where m is the number of producers*/
ПРОИЗВОДИТЕЛЬ - Каждый производитель производит только одно значение (обязательно - задание)
pthread_mutex_lock(&mutex);
/*Do some stuff*/
pthread_cond_signal(&consumer);
pthread_mutex_unlock(&mutex);
Является ли это можно сделать это только с условиями и мьютексом? Если нет, я предполагаю, что добавление семафора упростит ситуацию, но я предпочел бы сделать это без него.
Каждый производитель должен поместить свой продукт в глобальную переменную, к которой должен обращаться потребитель.
Если есть что-то еще, сообщите мне.
РЕШЕНИЕ : После прочтения ответа Джон Боллинджер, я был в состоянии исправить мою проблему и создать рабочую проблему производитель/потребитель.
/******************CONSUMER*****************/
pthread_mutex_lock(&mutex);
while(count < m) /*While there are more threads*/
{
/*Makes producers wait for the consumer to be ready before
altering the global variable*/
if(predicate = -1)
{
predicate = 0;
pthread_cond_signal(&producer);
}
/*Make consumer wait for the global variable to be altered*/
while(predicate == 0)
pthread_cond_wait(&consumer, &mutex);
/*Do some stuff with global variable*/
predicate = 0; /*Consumed*/
count++;
/*Tell a producer that the predicate has been consumed*/
pthread_cond_signal(&producer);
}
pthread_mutex_unlock(&mutex);
/********************PRODUCER********************/
pthread_mutex_lock(&mutex);
/*If the consumer is not ready yet, wait. I.e. if it's still
creating more threads*/
if(predicate == -1)
{
pthread_cond_wait(&producer, &mutex);
}
/*If there is already a product to be consumed, wait until
*consumed*/
while(predicate != 0)
{
pthread_cond_wait(&producer, &mutex);
}
/*Do some stuff with global variable*/
/*Tell consumer that a product is ready to be consumed*/
pthread_cond_signal(&consumer);
pthread_mutex_unlock(&mutex);
Если все дочерние (потребительские) потоки выполняются параллельно, а потоку родителя (производителя) просто нужно собирать свои результаты, он может просто «pthread_join» их по одному. Вероятно, это все равно. – Useless
@ Безболезненно. Я сейчас посмотрю, спасибо, что указал мне в правильном направлении. – MichaelDawn
@ Бездумно, я добавил немного информации в разделе «EDIT1», из-за того, как производитель должен получить доступ к результату, я не думаю, что могу использовать pthread_join? – MichaelDawn