linux下创建线程内存泄漏,php的json

 

这次还是把遇到的几个问题整理一下,希望再遇到的同学能轻松解决。另外最近博客的feeds延迟更新的原因也会一起说明一下。

1.linux下创建线程导致内存泄漏
今天在外网发布了一个server之后,用top发现virt的使用量一直在涨,而且一次涨8m。于是可以断定有内存泄漏了,经过排查,最终确定原因出在多线程的问题上:
代码如下:

					1
2
3
4
5
6
					pthread_t thread_id;
int ret=pthread_create(&thread_id, NULL, flush_thread_work, (void*)&m_sql_client);
if(ret!=0){
    APPSCORE_ERROR("Thread creation failed:%d",ret);
    return ret;
}

在flush_thread_work函数内部:

					1
2
3
4
5
					void* flush_thread_work(void* args)
{
    //....do something
    return NULL;
}

代码中启动了一个线程之后,主进程就继续执行,任由新线程自生自灭了(没有调用thread_join),而主进程每隔一段时间就会拉起这样一个线程来做一些数据落地的事情。

这样的写法实际上是会造成内存泄漏的.
Linux man page 里有已经说明了这个问题:

When a joinable thread terminates, its memory resources (thread descriptor and stack) are not deallocated until another thread performs pthread_join on it. Therefore, pthread_join must be called once for each joinable thread created to avoid memory leaks.

也就说线程执行完后如果不join的话,线程的资源会一直得不到释放而导致内存泄漏!

解决方法有两种:
a.在线程执行的函数内手工释放

					1
2
3
4
5
6
					void* flush_thread_work(void* args)
{
    //....do something
    pthread_detach(pthread_self());
    return NULL;
}

b.在线程启动时,设置线程的PTHREAD_CREATE_DETACHED属性

					1
2
3
4
5
6
7
8
9
10
11
12
13
14
					pthread_attr_t attr;
pthread_attr_init (&attr);
pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
 
int ret=pthread_create(&thread_id, &attr, flush_thread_work, (void*)&m_sql_client);
if(ret!=0){
    //记住attr也要析构,否则又是一个内存泄漏
    pthread_attr_destroy (&attr);
    APPSCORE_ERROR("Thread creation failed:%d",ret);
    return ret;
}
 
//记住attr也要析构,否则又是一个内存泄漏
pthread_attr_destroy (&attr);

这样问题就可以解决了。
参考资料:
解决了一个隐蔽的内存泄漏——pthread_create后没有detach导致内存持续增长

2.php的json_encode函数问题
在公司做了一个应用,是php与c++进行网络交互,所以选择了json这种比较通用的序列化格式,然而却遇到了比较奇怪的问题。
先来看如下代码(php):

					1
2
3
4
5
					$objs = array();
$objs[1] = 'a';
$objs[2] = 'b';
$objs[4] = 'd';
echo json_encode($objs)."\n";

输出的结果如下:

		{"0":"a","1":"b","3":"d"}

这样是正常的,用jsoncpp也可以正确的解析出来,php自动将$objs当作一个关联数组来生成json数据了。
然而当把代码换成如下:

					1
2
3
4
5
6
					$objs = array();
$objs[0] = 'a';
$objs[1] = 'b';
$objs[2] = 'c';
$objs[3] = 'd';
echo json_encode($objs)."\n";

则输出结果如下:

		["a","b","c","d"]

jsoncpp按照之前的解析方法是解析不出来的~
其实对php来说,这也是合理的,问题在于在php里面普通数组和关联数组都是array,而对c++来说,却存在vector和map之分,所以如果还是想要json_encode生成关联数组的格式,那么需要这样写:

					1
2
3
4
5
6
					$objs = array();
$objs[0] = 'a';
$objs[1] = 'b';
$objs[2] = 'c';
$objs[3] = 'd';
echo json_encode((object)$objs)."\n";

结果如下:

		{"0":"a","1":"b","2":"c","3":"d"}

3.本博feed延迟不更新的原因
之前由于对feedsky的feed更新十分不满,所以参考网上的做法,建立了一个feed.vimer.cn,而本博所在的域名空间会自动根据域名创建一个子目录 - feed,修改这个目录下的.htaccess文件如下:

					1
2
3
4
5
					<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule . http://feed.feedsky.com/vimer [L]
</IfModule>

那么当访问 feed.vimer.cn 时,会自动跳转到 http://feed.feedsky.com/vimer。
然而我忽略了一个问题,那就是wordpress默认的feed链接是 http://vimer.cn/feed/rss2,而/feed/rss2会被解析成子目录,从而自动跳转到 http://feed.feedsky.com/vimer ,所以feedsky就会不停的读 http://feed.feedsky.com/vimer 这个链接的feed,当然不会有任何新数据。。

所以最后还是把这种方式废弃掉了,看来真是冤枉了feedsky呀~~~

OK,最近的总结就这么多~

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索问题
, 线程
, 内存泄漏
, jsoncpp
, pthread_detach
, php threads
, 一个
, json_encode
feed
linux创建线程、linux c 创建线程、linux 创建线程函数、linux内核创建线程、linux创建多线程,以便于您获取更多的相关知识。

时间: 2024-08-31 04:21:36

linux下创建线程内存泄漏,php的json的相关文章

Linux下c++程序内存泄漏检测代码范例

Linux下对于程序内存泄漏检测的方法很多,最常用的的莫过于使用valgrind工具.但是valgrind相当于让程序在虚拟机中运行,会带 来较大的系统资源开销,还会对程序的运行效率产生较大影响,对于那种资源占用大的程序,如果需要长时间运行才能暴露的泄漏问题,它就显得不太好用. linux下的c++程序中自己实现一个轻量级的泄漏检测代码其实是比较方便的,下面我就给出一个简单的范例,并作简单的说明.当然,我们还是应该提倡使用共享指针,用共享指针自动管理内存可以避免内存泄漏这样的不必要的麻烦. 基本

4.windows和Linux下创建oracle用户名表空间,表,插入数据,用户管理表等操作

进入超级管理员,执行以下命令 Window下创建数据库,表空间,用户,插入数据等操作 -- 01 创建表空间 -- 注意表空间的路径 根据实际安装环境进行调整 CREATE TABLESPACE ts_myscott     LOGGING     DATAFILE 'F:/app/to-to/oradata/orcl/ts_myscott.dbf' SIZE 10M     EXTENT MANAGEMENT LOCAL;     CREATE TABLESPACE ts_myscott2  

在Linux下创建分区和文件系统的方法详解

  在 Linux 中创建分区或新的文件系统通常意味着一件事:安装 Gnome Parted 分区编辑器(GParted).对于大多数 Linux 用户而言,这是唯一的办法.不过,你是否考虑过在终端创建这些分区和文件系统?当然可以!以下就是方法! 使用 CFdisk 创建一个基本的 Linux 分区 以下是如何在命令行中创建一个基本的 Linux 分区的正确方案.要做的第一件事就是先打开你的终端.若你已打开,你需要找到你想要创建分区的磁盘.这可以使用一个简单的命令来找到. 复制代码 代码如下:

Linux下自动化监控内存、存储空间!

距离上一次更新文章已经过去一段时间了,小编在这段时间因为一些琐事,加上身体生病不能及时更新文章,今天身体逐渐恢复就急忙来更新文章,今天思梦给大家带来的就是如何自动化监控我们的服务器一些基本的配置来保证我们应用能更好的运行以及做好性能瓶颈的预测! 今天主要内容包含,Linux的基础Shell编程的流程控制语句.cut的使用.grep的使用.以及awk的使用就可以实现我们所说的事情了! 以下所讲命令配合不同的参数有不同的用处,思梦给大家讲的都是一些为了实现所说功能的基础使用,小伙伴们如果想更好的使用

linux下创建可引导的U盘系统及使用dd命令进行Linux的ghost

1,通过iso创建可引导的U盘系统. 1.0,格式化U盘为FAT32格式 linux下可以使用命令 mkfs.vfat U盘的设备路径 例如: mkfs.vfat /dev/sdb 其中U盘的路径可以通过命令df来查看 1.1,最简单的方法(但有些情况会失败,而且U盘不能再放其他文件,需要格式化后才能再使用): dd if=ISO的路径 of=U盘的设备路径 例如: dd if=CentOS-6.5-LiveDVD.iso of=/dev/sdb4 1.2,使用工具 很多工具都可以完成这个工作,

windows中借助junction、mklink实现linux下创建软链接的用法

windows也可以实现linux下软链接.硬链接的功能的,借住junction.mklink可以实现. junction 软链接也可以称作符号链接,类似于unix中的ln -s. 其实windows也是有这个功能的,不过windows貌似没有内置相关的符号连接工具.最好用的工具应该是Microsoft网站上提供的SysInternals套件,里面包含了大量的实用程序,其中junction.exe就是用来管理符号连接的. 使用junction所创建的符号链接文件夹并不会占用任何磁盘空间,它仅仅是

Linux下php-cgi占内存100%电脑变的很卡的解决方法

  Linux系统在使用的时候,电脑变的很卡,发现是php-cgi进程在占用cpu,占用率既然达到了100%,究竟是什么原因导致这种情况的呢?下面小编就给大家介绍下Linux系统php-cgi占用cpu百分百的解决方法. 网站日志目录/home/hosts_log 日志文件有对应的网站id php-cgi日志目录 /usr/local/php_fcgi/logs php-fpm.log slow.log 查看日志文件基本上就可以解决问题了,网站被入侵上传了一个php ddos文件,当然如果不是此

linux下创建且挂载光盘镜像

    在linux下可以很方便的将多个文件,或多个文件夹下的内容打包进光盘镜像中,我们可以用:     mkisofs -r -v -o xxx.iso /root /home 命令将/root以及/home目录下的文件打包到xxx.iso光盘镜像中去,然后通过mount loop的方式挂载:     mount -o loop xxx.iso /mnt 此时有个小问题,就是多个目录下的文件会以"平铺"的方式放到iso的根目录下,这可能不是我们的本意. 我们可以用-graft-poi

Linux下创建可执行bin安装文件

需求及应用场景 1.简化操作.一般的软件安装过程,如果想要精简步骤,我们一般会将需要在命令行中输入的命令写成一个脚本,同时将安装介质准备好.我们将脚本和安装介质上传到生产环境,然后通过执行脚本来完成安装.如果能够将这两个文件合并为一个可执行文件,那安装的过程就更简单明了. 2.代码保护.对于一段脚本,提供给用户使用,但是不希望用户看到脚本的内容,可以通过将脚本发布为.bin的形式.这样用户在环境中可以执行.安装,但是无法看到里面的内容,也无法修改,从而达到保护脚本内容的目的. 实现方法 1.本文