C语言多线程程序:输入线程、接收器对象和内存管理问题分析
C语言多线程程序:输入线程、接收器对象和内存管理问题分析
这段代码主要实现了以下功能:
- 创建一个输入线程,读取用户输入的字符并打印。
- 创建多个接收器对象,用于接收和处理数据。
然而,代码中存在一些问题,导致程序无法正常运行或者存在潜在的内存泄漏问题。
问题 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 函数只释放了 cck 和 ljh 指向的内存空间,但是另外两个 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);
解决方案
- 修改
input_thread函数中字符打印格式。 - 在
main函数中为input_thread_id指针分配内存。 - 只创建需要的
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;
}
总结
在编写多线程程序时,需要注意内存分配和释放问题,避免内存泄漏。同时,要根据实际需求创建和使用对象,避免不必要的资源浪费。
原文地址: https://www.cveoy.top/t/topic/oeAH 著作权归作者所有。请勿转载和采集!