这是代码示例
它创建了一个独立的pthread
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
void *show_message( void *ptr )
{
char *message;
message = (char *) ptr;
printf("[%s] start\n", message);
int x = 3;
for(x = 3 ; x > 0 ; --x){
printf("%s \n", message);
sleep(2);
}
printf("[%s] end\n", message);
}
int create_thread(char *message)
{
pthread_attr_t att;
pthread_attr_init(&att);
pthread_attr_setdetachstate(&att, PTHREAD_CREATE_DETACHED);
pthread_t thread;
pthread_create(&thread, &att, show_message, (void*)message);
return 0;
}
int main(){
sleep(3);
create_thread("Thread 1");
while(1) {};
return 0;
}
Valgrind结果显示没有泄漏
== 9872 ==堆概要:
== 9872 ==在退出时使用:0个块中的0个字节
== 9872 ==总堆使用量:2个allocs,2个frees,1,296个字节分配
==9872==
== 9872 ==所有堆块都被释放 - 没有泄漏是可能的
但我读/ proc / [pid] / statm
规模和居民得到更高
[~] $ while [ 1 ]; do cat /proc/`pidof pthread_example`/statm; sleep 2; done
1596 218 198 1 0 50 0 < - 运行
1596 218 198 1 0 50 0
20062 218 198 1 0 18516 0 < - [线程1]启动
20062 218 198 1 0 18516 0
20062 218 198 1 0 18516 0
20062 299 278 1 0 18516 0 < - [线程1]结束
20062 299 278 1 0 18516 0
为什么?
如果你问为什么在释放内存时进程内存大小没有减少,那实际上非常简单。
当进程中需要额外的内存时(例如当你尝试分配一些内存但没有足够的内存可以提供给你时),进程会从操作系统请求更多的内存。
但是,当你释放内存时,并不要求它实际上被重新发布回操作系统,更有可能的是它会在某个时候再次需要,所以这个过程会保留它以防万一。
想一想:
A B C
+--------+ +--------+ +--------+
| Memory | | Memory | | Memory |
| for | <-> | in | <- | in |
| you | | heap | | OS |
+--------+ +--------+ +--------+
当你分配并释放它时,内存可能会在A
和B
之间流动,但它只会根据需要从C
流向B
。当然,当你的进程退出时,B
中的任何内容都将被退回。
请记住,这是一个概念性描述,操作系统可能没有实际的内存,更准确的可能是操作系统只是将您的地址空间扩展到更大的大小。您拥有的任何虚拟内存管理器都会根据需要发出实际内存。