pthread线程函数传入参数打印异常(乱码/空值)问题求助
pthread_create传递文件名参数乱码/空值的解决方法
问题根源
核心问题是你传递给线程的是栈上局部变量的指针。当主线程中该局部变量所在的作用域结束(比如代码块执行完毕、函数返回),对应的栈帧会被销毁或覆盖,线程再访问这个指针指向的内存时,就会出现乱码、空值这类未定义行为。即使加了sleep,也只是暂时延缓问题,不是根本解决办法。
解决方法
以下是几种可靠的实现方案:
1. 动态分配内存(推荐)
在主线程中用malloc为文件名分配堆内存,线程函数使用完成后手动释放:
#include <stdio.h> #include <pthread.h> #include <unistd.h> #include <stdlib.h> #include <string.h> void* monitor_loglevel_change_handler(void* arg) { char* filename = (char*)arg; printf("线程内文件名:%s\n", filename); free(filename); // 用完释放堆内存 return NULL; } int main() { char* filename = malloc(256); if (!filename) { perror("malloc failed"); return 1; } strncpy(filename, "test.log", 255); filename[255] = '\0'; // 确保字符串结束符 printf("主线程内文件名:%s\n", filename); pthread_t tid; pthread_create(&tid, NULL, monitor_loglevel_change_handler, filename); pthread_join(tid, NULL); // 等待线程执行完毕,避免内存泄漏 return 0; }
2. 使用静态变量
将文件名定义为静态变量,其生命周期贯穿整个程序运行期间,不会随局部作用域销毁:
#include <stdio.h> #include <pthread.h> #include <unistd.h> #include <string.h> void* monitor_loglevel_change_handler(void* arg) { char* filename = (char*)arg; printf("线程内文件名:%s\n", filename); return NULL; } int main() { static char filename[256]; // 静态变量存储在全局数据区 strncpy(filename, "test.log", sizeof(filename)-1); filename[sizeof(filename)-1] = '\0'; printf("主线程内文件名:%s\n", filename); pthread_t tid; pthread_create(&tid, NULL, monitor_loglevel_change_handler, filename); pthread_join(tid, NULL); return 0; }
3. 使用全局变量(简单但不推荐多线程场景)
把文件名设为全局变量,线程直接访问即可:
#include <stdio.h> #include <pthread.h> #include <unistd.h> char filename[256]; // 全局变量 void* monitor_loglevel_change_handler(void* arg) { printf("线程内文件名:%s\n", filename); return NULL; } int main() { snprintf(filename, sizeof(filename), "test.log"); printf("主线程内文件名:%s\n", filename); pthread_t tid; pthread_create(&tid, NULL, monitor_loglevel_change_handler, NULL); pthread_join(tid, NULL); return 0; }
缺点:全局变量在多线程场景下容易引发资源竞争,必须配合同步机制使用。
关键注意事项
- 绝对避免传递栈上局部变量的指针给线程,栈帧销毁后内存会被系统重用。
- 用
pthread_join替代sleep等待线程执行完成,这是更可靠的同步方式,能确保线程执行完毕后主线程再继续。 - 若使用动态分配内存,必须明确内存释放的责任方,避免内存泄漏。
内容的提问来源于stack exchange,提问作者myquest9 sh
相关产品推荐
相关产品推荐

