子线程操作malloc内存
来源:互联网 发布:java split函数 多个 编辑:程序博客网 时间:2024/09/21 06:37
这个问题的引出是由于,在实际应用过程中遇到主程序需要调用独立的功能模块(API),并获取其返回结果,
可以通过文件操作,将功能模块生成结果写入日志,主程序读取日志结果,而主程序提取日志信息后,要需要形成新的
日志文件,这个过程就涉及到三次文件打开关闭操作,影响软件性能;
API实际处理运算是在其内部创建的子线程的子线程(该API是在第三方API基础封装)中完成,线程创建过程能够传递
(void *)类型的参数,按照上面文件的操作也是将文件名作为字符串传入线程任务函数,处理结果形成特定的文件名的
日志;既然能够传递字符串,为何不直接传递可操作的地址到线程内部,直接将处理结果写入到地址中,于是就有了另外
的方法,在调用该API的主程序中先malloc申请一段内存(ch)用来存储处理结果,将内存首地址作为API形参传入,
然后将地址的数值转化为字符串(addr_ch),通过创建线程时传入到线程任务函数中,在线程内存先通过atoi库函数转化成
unsigned long存储(addr),接着强制转化成地址指针,最后就可以操作malloc的地址了(因为malloc申请内存在堆区,唯一性)。
测试代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
void *task(void *data){
printf("Enter thread.\n");
char *addr_ch = data;
printf("thread:addr_ch:%s\n",addr_ch);
unsigned long addr = atoi(addr_ch); //地址字符串存储成数值
printf("thread:addr:%ld\n",addr);
char *ch = (char *)addr; //强转成地址指针
*ch = 'B'; //操作地址
printf("thread:%c\n",*ch);
sleep(3);
return NULL;
}
int main(int argc,char *argv[]){
char *ch = malloc(sizeof(char)); //malloc一个char
char addr_ch[15] = {0}; //用来存储ch的地址
sprintf(addr_ch,"%d",ch); //ch地址转化为字符串存储到addr_ch
pthread_t td;
if(pthread_create(&td,NULL,task,(void *)addr_ch)) //创建线程,并将地址字符串addr_ch作为参数传入线程task
printf("pthread_create failed.\n");
pthread_join(td,NULL); //等待子线程处理完成
printf("Thread return.\n"); //检测子线程的操作是否生效
printf("main:%c\n",*ch);
free(ch);
ch = NULL;
return 0;
}
通编译:gcc xxx.c -lpthread
可执行程序:a.out
执行a.out就可以看到在子线程内存成功操作主线程的malloc存储区域,线程处理的这部分功能就可以封装成API,然后预留
用来传递malloc地址的接口,这样API处理的结果就直接通过接口参数返回给主程序,当然该API接口可设定返回值用来给主
程序判定是否成功处理,0成功-1失败,根据返回值来判定是否操作之前malloc的内存。
功底有限,还需努力。
- 子线程操作malloc内存
- 内存操作函数: malloc
- 并发操作子线程
- QT操作Excel时将读写功能置于子线程内存报错解决方案
- c#子线程操作ui
- iOS子线程操作总结
- android子线程操作ui
- malloc 内存
- Android 子线程中操作UI线程
- 内存管理:new/delete操作符与malloc()/free()函数
- C语言中内存操作函数 - malloc/calloc ,free
- 内存堆分配操作函数的使用(realloc,malloc等)
- malloc与free对被操作内存的影响
- C#子线程的控件操作
- Android 子线程操作更新UI方法
- 主线程等待子线程操作完成
- 308_子线程操作UI方法
- 子线程中更新UI操作
- Arch linux 的安装
- linux常用命令
- hibernate进阶之路之多对多映射(五)
- iOS Provisioning Profile总莫名其妙失效问题
- Object.keys的兼容性和用法
- 子线程操作malloc内存
- VC6.0蕉HOOK_timeGetTime 达到变速效果
- Android基础--简单介绍Application
- 数据库损坏解决:数据库已损坏,无法分配空间
- 项目中tld文件使用
- Android 拦截Home键的常用方法
- 动态库和静态库的区别
- 小白进阶之贪心算法VS动态规划
- java jar 打包命令