Что вы делаете, если ставите в очередь быстрее, чем в очереди? - PullRequest
0 голосов
/ 29 апреля 2020

Я работаю с 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 решит проблему с постановкой в ​​очередь быстрее, чем с удалением, но это не помогло.

1 Ответ

1 голос
/ 30 апреля 2020

Функция будет замедлять processDataThread, заставляя inputThread заполнить очередь до того, как processDataThread сможет удалить из очереди.

Это нормально. Работа, выполняемая потоками, часто медленнее генерации ввода для этих потоков (что может быть так же просто, как чтение строк из файла). Помните, что мы используем потоки для распараллеливания медленных процессов.

Это приводит к пропущенным данным

Что-то не так с вашей очередью, если она теряет данные !

Я уверен, что очередь и очередь работают.

Нет, очередь, которая теряет данные, не "работает".


Вы не показали код, который пытаетесь отлаживать, как требуется, поэтому мы можем только догадываться о проблеме. Похоже, у вас есть очередь фиксированного размера, и enqueue просто оставляет элемент, чтобы добавить в очередь, если очередь заполнена. Это ошибка.

Если это проблема, либо увеличивайте очередь, когда она заполнится, либо блокируйте, пока не останется место для постановки в очередь того, что вы хотите поставить в очередь. Эта реализация рабочей очереди делает последнее.

...