C-thth mutex - PullRequest
       10

C-thth mutex

0 голосов
/ 24 сентября 2018

У меня есть простая программа, которая отображает символ, введенный пользователем.Для выполнения этой функции эха созданы два потока, и я использую мьютекс pthread для привязки критического кода к одному процессу за раз, чтобы символ правильно выводился на печать:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

char characterIn, characterOut;

void* echoCharacter()
{
    pthread_mutex_lock(&mutex);
    /* crital code start */
    characterIn = getchar();
    characterOut = characterIn;
    putchar(characterOut);
    /* crital code end */
    pthread_mutex_unlock(&mutex);
    pthread_exit(NULL);
}

int main()
{
    //spawn
    pthread_t id;
    pthread_t id1;
    pthread_create(&id, NULL, echoCharacter, NULL);
    pthread_create(&id1, NULL, echoCharacter, NULL);
    //wait 
    pthread_join(id, NULL);
    pthread_join(id1, NULL);

    return 0;
}

Однако я неполучить правильный вывод.Он отображает только первый символ, введенный первым потоком, но программа останавливается после этого и не просит ввести другой символ:

>>a
>>a
>>

ожидаемый вывод:

>>a
>>a
>>b
>>b

1 Ответ

0 голосов
/ 24 сентября 2018

Если вы вводите a в строке (за которой следует клавиша ENTER ), то на самом деле - это два символа, a и \n.

Если вы введете ab без вмешательства ENTER , вы должны увидеть ab эхо-ответ (как только вы нажмете ENTER впоследствии, так как ваша консоль наиболее вероятнав готовом режиме).

Быстрое подтверждение можно получить, просто добавив дополнительный getchar() для "проглатывания" новой строки:

characterIn = getchar();
getchar();
characterOut = characterIn;

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

...