c - 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
解决方案
如果您在a
一行上输入(后跟ENTER键),那实际上是两个字符,thea
和\n
.
如果你ab
在没有干预的情况下进入ENTER,你应该会看到ab
回显(一旦你点击ENTER之后,因为你的控制台很可能处于熟化模式)。
只需放置一个额外getchar()
的“吞下”换行符即可快速确认:
characterIn = getchar();
getchar();
characterOut = characterIn;
这是出于调试目的,它并不是一个真正可行的解决方案。一个可行的解决方案是使用基于行的输入,如此处详述。
推荐阅读
- javascript - 图像图标不固定,屏幕尺寸可变
- sapui5 - 如何从 UI5 应用程序调用 CDS 视图生成的 Odata 服务
- regex - 从 URL 字符串中获取令牌
- java - 处理程序未在 Instrumentation Test 中执行 Runnable
- javascript - 获取数据到数据库,如果匹配则重新插入
- java - 如何在 testng.xml 文件中查找正在执行的测试数量
- log4net - 使用 AzureAppendBlobAppender 在 Azure blob 中写入文本文件
- java - 已连接:但没有输出
- html - 如何从菜单底部删除 iphone 阴影
- c# - 如何使用 C# 将复杂的 JSON 数组响应转换为简单的 Json