如何解决使用两个线程从标准输入读取数据
我正在尝试使用两个线程从标准输入 (stdin) 读取数据,但无法正确读取数据。我在 Linux 平台上尝试使用 gcc 编译器。我正在尝试使用 cat 命令和管道读取数据。
cat Test.txt | ./a.out
我得到这样的输出:
我在这里做错了什么?
#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
// Declaring mutex
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
void *input(void *ptr)
{
while(1)
{
char str[20];
memset(str,'\0',20);
int result;
pthread_mutex_lock(&lock);
result = read(STDIN_FILENO,str,sizeof str);
if (result <= 0)
{
printf("====\n");
pthread_exit(NULL);
return NULL;
}
pthread_mutex_unlock(&lock);
printf("Reader: %s\n",str);
}
}
int main()
{
pthread_t t1,t2;
pthread_create(&t1,NULL,input,NULL);
pthread_create(&t2,NULL);
pthread_join(t1,NULL);
pthread_join(t2,NULL);
return 0;
}
我的Test.txt文件数据:
AAAAAAABBBCCCddddDDEFG
mmmmmmmmmmgggggggggwwwghgmaaaaabbb
rrrrrrRSSghgmtttttddddrrr
a
解决方法
%s
printf
格式说明符需要一个以空字符结尾的字符串。您正在向它传递一个不以空字符结尾的字符串。这会导致未定义的行为。
我建议你换线
result = read(STDIN_FILENO,str,sizeof str);
到:
result = read(STDIN_FILENO,sizeof str - 1);
此外,您应该在调用 pthread_exit
之前解锁互斥锁,否则可能会出现死锁。
与其在整个数组上使用 memset
,不如添加一行更高效
str[result] = '\0';
紧接在 printf
语句之前。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。