我有一个简单的程序,它可以回传用户输入的字符。创建了两个线程来运行这个echo函数,我使用pthread mutex一次将关键代码锁定到一个进程,以便正确打印字符:

#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

最佳答案

如果您在一行上输入a(后跟回车键),实际上是两个字符,a\n
如果您输入ab时没有中间的输入,您应该会看到ab回显(一旦您随后点击enter,因为您的控制台很可能处于煮熟模式)。
只需放置一个额外的getchar()来“吞下”换行符即可快速确认:

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

这是出于调试的目的,并不是一个真正可行的解决方案。一个可行的解决方案是使用基于行的输入,例如detailedhere

关于c - C pthread互斥锁,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52471968/

10-14 06:10