出没于杭州和青岛的程序猿一枚,对内核略懂一二
分类: LINUX
2012-11-27 11:01:11
先看一段代码
点击(此处)折叠或打开
这个代码只有几十行,但足以说明问题。如果你不能看出代码有什么严重的bug,那么请继续往下走。。。
编译运行结果如图:
从上面的运行结果可以看出,重启运行20次后,出现了bug。
下面我们调试一下:
使用gdb对子进程进行调试,发现子进程被block在一个锁上面。Why?
Man localtime_r
Localtime_r is thread-safe function.
Localtime_r使用了锁机制来保证该函数是线程安全的,但就是这个thread-safe导致了问题的发生。而且从上面的测试可以看出,不是每次都会block住,只是偶尔会被block。
Linux下父进程在fork子进程的时候,子进程会继承父进程的变量。
上面的问题出现的流程可以大体描述如下:
父进程存在线程调用localtime_r函数,那么当父进程fork子进程的时候,可能会出现某一个线程已经lock了localtime_r的锁,这时候子进程继承了这个已经标记为lock的锁。这样就导致了在子进程中调用localtime_r获取锁的时候,一直被block。
所有在多进程环境下使用thread-safe函数的时候,需要避免这种问题的出现。
C011413072012-11-28 18:57:04
http://blog.chinaunix.net/uid-7931217-id-3424683.html
系统函数,无法用pthread_atfork来解决,想到的解决方案:
将子进程的内容,封装到一个单独的二进制文件
fork()出来的子进程,执行体就是execve这个单独的二进制文件
不知道还有其他的方法没有?