微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用两个线程从标准输入读取数据

如何解决使用两个线程从标准输入读取数据

我正在尝试使用两个线程从标准输入 (stdin) 读取数据,但无法正确读取数据。我在 Linux 平台上尝试使用 gcc 编译器。我正在尝试使用 cat 命令和管道读取数据。

cat Test.txt | ./a.out

我得到这样的输出

img

在这里做错了什么?

#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 举报,一经查实,本站将立刻删除。