Я работаю с pthreads в C. У меня есть поток 1, который получает данные от аппаратного обеспечения, и эти данные помещаются в очередь. У меня есть поток 2, который получает уведомление, когда данные находятся в очереди и обрабатывает эти данные. Псевдокод моего фактического кода приведен ниже.
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
void* inputThread(void *ptr){
while(){
getData(var1); //Notified by external hardware interrupt when data is available. var1 will hold new data
enqueue(q1, var1);
pthread_mutex_lock(&lock1);
pthread_cond_signal(&condition1);
pthread_mutex_unlock(&lock1);
}
}
void* processDataThread(void *ptr){
short data_to_process[];
while(){
pthread_mutex_lock(&lock1);
while (emptyqueue(q1)) {
pthread_cond_wait(&condition1,&lock1); //wait for inputthread to fill queue
}
data_to_process=dequeue(q1);
pthread_mutex_unlock(&lock1);
process_data(data_to_process); //causes thread to slow down
}
}
int main(void){
pthread_t input_thread_id;
pthread_t thr[10];
struct queue q1;
struct queue q2;
//
//
//some code to initiate queues, locks/mutex, conditions, etc.
//
//
for (j) {
pthread_create(&thr[j], NULL, processDataThread,(void*) &ptr);
}
sleep(3); //sleep to let processthreads start up
pthread_create(&input_thread_id, NULL, inputThread,(void*) &ptr);
}
Я уверен, что очередь и очередь работают. Я записал в файл и проверил, что все, что я получаю в inputThread, исключено. У меня проблема, когда в код помещается функция process_data()
. Функция будет замедлять processDataThread, заставляя inputThread заполнить очередь до того, как processDataThread сможет отключиться. Это приводит к пропущенным данным, потому что inputThread работает быстрее, чем processDataThread. Если я закомментирую функцию `process_data () ', очередь не переполнится. Даже после увеличения числа processDataThreads (я пробовал 3, 5 и 10) очередь все еще ставится в очередь быстрее, чем в очереди.
время выполнения getData()
до dequeue()
равно 0,01, и программа непрерывно работает в l oop без заполнения очереди время выполнения getData()
до process_data()
равно .05s, а очередь заполняется через несколько секунд.
Что я делаю не так? Я думал, что увеличение числа processDataThread решит проблему с постановкой в очередь быстрее, чем с удалением, но это не помогло.