#c #pthreads #producer-consumer
#c #pthreads #производитель-потребитель
Вопрос:
Я пытаюсь реализовать очередь блокировки с использованием потоков POSIX. Важные сегменты кода показаны ниже. Я попытался запустить эту программу. Поток, пытающийся удалить элемент из очереди, переходит в спящий режим, когда в очереди нет элементов, и снова просыпается без какого-либо сигнала от потока, который добавляет элемент в очередь (я делаю вывод, потому что я не запускал ни одного потока, который добавляет элемент в очередь). в очередь). Проснувшийся поток снова переходит в спящий режим, и этот процесс повторяется. Что я делаю не так? Пожалуйста, кто-нибудь скажет мне, чего мне здесь не хватает?
struct rqueue
{
int qsize;
int capacity;
pthread_mutex_t lock;
pthread_cond_t not_empty;
pthread_cond_t not_full;
};
remove_element_method:
pthread_mutex_lock(amp;rq->lock);
while(rq->qsize == 0){
perror("Q size is zero going to sleep");
pthread_cond_wait(amp;rq->not_empty);
perror("woke up");
}
// some code
pthread_cond_signal(amp;rq->not_full);
pthread_mutex_unlock(amp;rq->lock);
add_element_method:
pthread_mutex_lock(amp;rq->lock);
if(rq->capacity != -1 ){
while(rq->qsize == rq->capacity){
pthread_cond_wait(amp;rq->not_full);
}
}
//some code
pthread_cond_signal(amp;rq->not_empty);
pthread_mutex_unlock(amp;rq->lock);
Ответ №1:
pthread_cond_wait() принимает два аргумента — второй — это мьютекс, который вы удерживаете. Вы передаете ему только один аргумент.
Кроме того, вы инициализировали переменные мьютекса и условия с помощью pthread_mutex_init() и pthread_cond_init()?
Комментарии:
1. Кроме того, как часто это происходит? Если это редко, это нормально — это может быть ложное пробуждение .
2. Большое спасибо. Я забыл второй аргумент. Кажется, сейчас он работает. Но компилятор должен сказать, что нет соответствующей функции, верно?
3. Если компилятор принял ваш код с отсутствующим аргументом, это почти наверняка означает, что вы (1) забыли включить
pthread.h
и (2) отключили все предупреждения.