首页 > 解决方案 > C pthread 互斥锁

问题描述

我有一个简单的程序来回显用户输入的字符。创建了两个线程来运行这个 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

标签: cpthreadsmutex

解决方案


如果您在a一行上输入(后跟ENTER键),那实际上两个字符,thea\n.

如果你ab在没有干预的情况下进入ENTER,你应该会看到ab回显(一旦你点击ENTER之后,因为你的控制台很可能处于熟化模式)。

只需放置一个额外getchar()的“吞下”换行符即可快速确认:

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

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


推荐阅读