Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C pthread互斥体_C_Pthreads_Mutex - Fatal编程技术网

C pthread互斥体

C pthread互斥体,c,pthreads,mutex,C,Pthreads,Mutex,我有一个简单的程序,可以呼出用户输入的字符。创建两个线程来运行此echo函数,我使用pthread mutex将关键代码一次锁定到一个进程,以便正确打印字符: #include <stdio.h> #include <stdlib.h> #include <pthread.h> pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; char characterIn, characterOut; void*

我有一个简单的程序,可以呼出用户输入的字符。创建两个线程来运行此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
>>b
>>b

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

如果您在没有输入的情况下输入
ab
,您应该会看到
ab
回显(在之后按enter键时,因为您的控制台很可能处于烹调模式)

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

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

这是为了调试的目的,它不是一个真正可行的解决方案。一个可行的解决方案是使用基于行的输入,例如detailed。

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

如果您在没有输入的情况下输入
ab
,您应该会看到
ab
回显(在之后按enter键时,因为您的控制台很可能处于烹调模式)

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

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

这是为了调试的目的,它不是一个真正可行的解决方案。一个可行的解决方案是使用基于行的输入,例如detailed。

哦,哇,我完全忘记了这一点。我认为这是一个完全不同的问题。我现在觉得很傻,因为这太简单了哇,我完全忘了。我认为这是一个完全不同的问题。事情就这么简单,我觉得自己很傻