Предисловие: я новичок в многопоточном программировании и немного ржавый с C++. Мои требования - использовать один мьютекс и два условия: mNotEmpty
и mEmpty
. Я также должен создавать и заполнять векторы так, как указано ниже.Один продюсер, два потребителя, выступающий в одной очереди, произведенный продюсером
У меня есть одна продюсерская нить, создающая вектор случайных чисел размером n*2
и два пользователя, вставляющих эти значения в два отдельных вектора размера n
.
Я делаю следующее в производителе:
- блокировки мьютекс:
pthread_mutex_lock(&mMutex1)
- Подожди потребитель сказать вектор пуст:
pthread_cond_wait(&mEmpty,&mMutex1)
- оттеснить значение в вектор
- Сигнал потребителю о том, что вектор больше не пуст:
pthread_cond_signal(&mNotEmpty)
- Разблокировать мьютексы:
pthread_mutex_unlock(&mMutex1)
- Вернуться к шагу 1
В потребителе:
- Замка мьютекс:
pthread_mutex_lock(&mMutex1)
- Проверьте, чтобы увидеть, если вектор пуст, и если да сигнализировать производитель:
pthread_cond_signal(&mEmpty)
- Повторное добавление значения в один из двух новых векторов (в зависимости от того, какой поток) и удалить из исходного вектора
- Разблокировать мьютексы:
pthread_mutex_unlock(&mMutex1)
- Вернуться к шагу 1
Что случилось с моим процессом? Я продолжаю получать ошибки сегментации или бесконечные циклы.
Edit: Вот код:
void Producer()
{
srand(time(NULL));
for(unsigned int i = 0; i < mTotalNumberOfValues; i++){
pthread_mutex_lock(&mMutex1);
pthread_cond_wait(&mEmpty,&mMutex1);
mGeneratedNumber.push_back((rand() % 100) + 1);
pthread_cond_signal(&mNotEmpty);
pthread_mutex_unlock(&mMutex1);
}
}
void Consumer(const unsigned int index)
{
for(unsigned int i = 0; i < mNumberOfValuesPerVector; i++){
pthread_mutex_lock(&mMutex1);
if(mGeneratedNumber.empty()){
pthread_cond_signal(&mEmpty);
}else{
mThreadVector.at(index).push_back[mGeneratedNumber.at(0)];
mGeneratedNumber.pop_back();
}
pthread_mutex_unlock(&mMutex1);
}
}
Это было бы намного легче ответить, если бы вы представили минимальную компилируемую программу, которая продемонстрировала вашу проблему. – Mankarse
Ну, если вы ждете внутри замка, тогда ожидайте тупика где-нибудь в какой-то момент в будущем. – ActiveTrayPrntrTagDataStrDrvr
Шаг 4 производителя говорит, чтобы сигнализировать потребителю с mNotEmpty, но mNotEmpty не используется потребителем. –