Nano Hash - криптовалюты, майнинг, программирование

зацикливать вывод сообщения на стандартный вывод каждую секунду во время ожидания ввода - PTHREAD

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

вывод, который он мне предоставляет:

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

В вашем случае вам нужно синхронизировать два потока чтения и записи. В этом случае проще всего использовать 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 ...

Вы также можете получить некоторые знания из этого руководства поток

03.04.2020
Новые материалы

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

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..