Неправильная синхронизация потоков - поток не сигнализирует другой поток - PullRequest
0 голосов
/ 09 марта 2019

У меня проблема в моей программе.Для упражнений в школе я попытался составить программу, которая считывает входные данные и выводит их на выход.Так просто.Тем не менее, когда я запускаю следующую программу, кажется, застрял.Я печатаю некоторые сообщения, и они обычно, в зависимости от потоков, заканчиваются так:

  • сигнализирующий поток 2
  • ожидающий поток 1
  • в ожидании потока2

Я не понимаю, как это может произойти.Предполагается, что поток 1 сигнализирует другой поток, но они все равно оказываются в состоянии ожидания, поток 2 не прерывается во время цикла, хотя и получил сигнал.Теперь, когда я раскомментирую свои комментарии, где я физически изменяю свои num_of_chars и записанные значения, это работает.Тем не менее, эта программа работает медленно.Пожалуйста, если у вас есть идеи, почему это не работает, почему pthread_cond_signal не работает, дайте мне знать.Также, если вы знаете, как эта программа может работать немного быстрее, я был бы великолепен.:) программа

#define V  300

pthread_cond_t loading;
pthread_cond_t write_down;
pthread_mutex_t mutex;
char a[V];
int num_of_chars = 0;
int written = 0;


void *input() {

    while(1){
        pthread_mutex_lock(&mutex);

        while(num_of_chars > 0){
            printf("waiting for a signal from thread2");
            fflush(stdout);
            pthread_cond_wait(&loading, &mutex);        
        }
        num_of_chars = fread(a, sizeof(char), V, stdin);

        if(num_of_chars == 0){
            //written = 3;
            pthread_mutex_unlock(&mutex);
            pthread_cond_signal(&write_down);
            pthread_exit(NULL);
        }
        if(num_of_chars <= V){
            printf("signalizing thread2");
            fflush(stdout);
            //written = 3;
            pthread_cond_signal(&write_down);
        }
        pthread_mutex_unlock(&mutex);
    }

}

void *output() {
    while(1){
        while(written == 0){
            printf("waiting for a signal from thread1");
            fflush(stdout);
            pthread_cond_wait(&write_down, &mutex); 
        }
        written = fwrite(a, sizeof(char), num_of_chars, stdout);
        fflush(stdout);

        if(num_of_chars == 0){
            pthread_mutex_unlock(&mutex);
            pthread_exit(NULL);
        }
        if(num_of_chars > 0){
            printf("signalizing thread1");
            fflush(stdout);
            //written = 0;
            //num_of_chars = 0;
            pthread_cond_signal(&loading);

        }
        pthread_mutex_unlock(&mutex);
    }
}

int main (void) {
    pthread_t t1, t2; 

    pthread_mutex_init(&mutex, NULL);
    pthread_cond_init (&loading, NULL);
    pthread_cond_init (&write_down, NULL);

    pthread_create(&t1, NULL, input,  NULL);
    pthread_create(&t2, NULL, output,  NULL);


    pthread_join(t1, NULL);
    pthread_join(t2, NULL);

    /*pthread_mutex_destroy(&mutex);
    pthread_cond_destroy (input);
    pthread_cond_destroy(output);*/
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...