l oop выводит сообщение в стандартный вывод каждую секунду, ожидая ввода - PTHREAD - PullRequest
0 голосов
/ 03 апреля 2020

Я работаю с темами. У меня есть поток, выводящий в стандартный вывод "ожидание ..." каждую a1 секунду. Я пытаюсь что-то записать в стандартный ввод в моем основном потоке, но каждую секунду, когда происходит «ожидание ...», он засасывает буквы, которые я смог написать до сих пор. Я действительно запутался в этом. Я предполагаю, что мне нужно выводить только тогда, когда в стандартном вводе обнаружена новая строка, но я не знаю, как это проверить.

вывод, который он мне дает:

waiting ...
waiting ...
fri <-- me trying to input friends 
friwaiting ... <-- fri gets sucked in halfway through me typing it
waiting ...
waiting ...

мой код:

void* thread_one(void* arg){

    while(1){
        sleep(1);
        if (write(1, "waiting ...\n", 12) != 12) {
            write(2, "There was an error writing to standard out\n", 44);
        }
    }
    return NULL;
}

int main(int argc, char **argv){
    char buffer[11];
    pthread_t tid;
    pthread_create(&tid, NULL, thread_one, NULL);

    while(1){
        int r = read(0, buffer, 10);
        if(r<=0){
            break;
        }
        buffer[r] = 0;
        printf("message: %s\n", buffer);

        if(strcmp(buffer, "exit\n")==0){
            break;
        }

    }

    return 0;
}

Любая точка в правильном направлении очень ценится. Заранее спасибо!

1 Ответ

0 голосов
/ 03 апреля 2020

В вашем случае вам нужно синхронизировать два потока чтения и записи. В этом случае наиболее простым является использование mutex. Вы можете увидеть код ниже:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h>
#include <pthread.h>
#include <time.h>
#include <unistd.h>

// using the mutex "lock"
pthread_mutex_t lock;
void* thread_one(void* arg){

    while(1){
        sleep(1);
        // lock the mutex
        pthread_mutex_lock(&lock);
        if (write(1, "waiting ...\n", 12) != 12) {
            write(2, "There was an error writing to standard out\n", 44);
        }
        // unlock the mutex after writing
        pthread_mutex_unlock(&lock);
    }
    return NULL;
}

int main(int argc, char **argv){
    char buffer[11];
    pthread_t tid;
   pthread_mutex_init(&lock], NULL);
    pthread_create(&tid, NULL, thread_one, NULL);

    while(1){
        // lock mutex to read
        pthread_mutex_lock(&lock);
        int r = read(0, buffer, 10);
        // unlock after reading
        pthread_mutex_unlock(&lock);
        if(r<=0){
            break;
        }
        buffer[r] = 0;
        printf("message: %s\n", buffer);

        if(strcmp(buffer, "exit\n")==0){
            break;
        }

    }

    return 0;
}

вывод:

waiting ...
message: friday

monday
message: monday

waiting ...

Вы также можете иметь некоторые знания в этом уроке pthread

...