C语言多线程程序:输入线程、接收器对象和内存管理问题分析

这段代码主要实现了以下功能:

  1. 创建一个输入线程,读取用户输入的字符并打印。
  2. 创建多个接收器对象,用于接收和处理数据。

然而,代码中存在一些问题,导致程序无法正常运行或者存在潜在的内存泄漏问题。

问题 1:输入线程中字符打印格式错误

input_thread 函数中,getchar() 函数返回的是一个字符,应该使用 %c 格式符来打印,而不是 %s

char a = getchar();
printf("You just pressed '%c'", a);

问题 2:线程ID内存分配错误

main 函数中,未分配 input_thread_id 指针所指向的内存空间,应该先分配内存再传递给 pthread_create 函数。

pthread_t input_thread_id;
pthread_create(&input_thread_id, NULL, input_thread, NULL);

问题 3:接收器对象内存分配和释放问题

main 函数中,只调用了两个 Receiver 对象的函数,但是同时创建了四个 Receiver 对象,另外两个 Receiver 对象没有被使用,造成了浪费。此外,receiver_deinit 函数只释放了 cckljh 指向的内存空间,但是另外两个 Receiver 对象也分配了内存空间,应该一同释放。

// 创建两个Receiver对象
Receiver *cck = receiver_init(u8"陈驰坤", "2020316101023");
Receiver *ljh = receiver_init(u8"李佳禾", "2020316101061");

// 使用两个Receiver对象
Receiver *receivers[] = {cck, ljh};
int receivers_length = sizeof(receivers) / sizeof(receivers[0]);

for (int i = 0; i < receivers_length; ++i) {
    receiver_notify(receivers[i], print);
}

// 释放两个Receiver对象的内存空间
receiver_deinit(cck);
receiver_deinit(ljh);

解决方案

  1. 修改 input_thread 函数中字符打印格式。
  2. main 函数中为 input_thread_id 指针分配内存。
  3. 只创建需要的 Receiver 对象,并释放所有 Receiver 对象的内存空间。

修改后的代码

#include <assert.h>
#include <pthread.h>
#include <termios.h>

#include "receiver.h"

void *input_thread(void *arg) {
    while (1) {
        char a = getchar();
        printf("You just pressed '%c'", a);
    }
}

int main() {
    pthread_t input_thread_id;
    pthread_create(&input_thread_id, NULL, input_thread, NULL);

    // 创建两个Receiver对象
    Receiver *cck = receiver_init(u8"陈驰坤", "2020316101023");
    Receiver *ljh = receiver_init(u8"李佳禾", "2020316101061");

    // 使用两个Receiver对象
    Receiver *receivers[] = {cck, ljh};
    int receivers_length = sizeof(receivers) / sizeof(receivers[0]);

    for (int i = 0; i < receivers_length; ++i) {
        receiver_notify(receivers[i], print);
    }

    // 释放两个Receiver对象的内存空间
    receiver_deinit(cck);
    receiver_deinit(ljh);
    return 0;
}

总结

在编写多线程程序时,需要注意内存分配和释放问题,避免内存泄漏。同时,要根据实际需求创建和使用对象,避免不必要的资源浪费。

C语言多线程程序:输入线程、接收器对象和内存管理问题分析

原文地址: https://www.cveoy.top/t/topic/oeAH 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录