挖井

类库大魔王的挖井日记

挖一口属于自己的井


又修正一个线程挂死的问题

最近一直在用shell脚本自动在跑一个简单的测试,就是不停地停止和重新启动一个relay进程,如此反复轮循,这样每过一段时间,比如两三天,或者更短或者更长,就会遇到一个问题:再也停不了任何一个relay进程,也不会重新启动进程。

说实话,我重现出这个问题很多次,但一直没有想到从哪里入手解决。这个问题涉及到三个部分:

  • RESTful接口处理程序
  • 消息分派程序
  • 进程管理程序

从log看,前两个程序似乎一直在正常地收发消息。后来我发现重启前两个程序问题现象并不消失,只有重启进程管理程序才能恢复正常。

今天突然想到,这应该又是线程挂住在哪里引起的了。于是今天又重现了这个问题,立马用gdb attach上去,看了一下线程果然等在waitpid这个调用上了。程序原本的逻辑中就是收到一个stop子进程命令时,就发个SIGTERM信号过去,然后等它退出,Linux的进程创建和退出上,我一直觉得没有Windows那么容易理解。前段时间我为了修正杀子进程后变僵尸进程的问题,忽略了SIGCHLD信号,所以照理也不需要waitpid了,因为init进程会帮忙解决这个问题,但因为一时也没遇到问题,所以那行代码也一直留在那里。现在把这行代码删掉,问题应该就解决了。

本文地址:

https://minidump.info/blog/2015/01/fixed-another-hang-issue/

上一篇

使用Travis服务交叉编译Go程序

昨天花了一天时间,把github上几个Go程序通过travis实现交叉编译,再把编译生成的二进制可执行文件push回github上的prebuilt branch,这样每次有新的commit后,都会自动生成各个支持平台的最新的二进制可执行文件,相当方便。可以看看以下几个repo,README上...…

Go 全文阅读
下一篇

我对Lua coroutine的理解

今天一个人闲来无事跑去图书馆续证,结果发现证上说的2年有效期虚惊一场,不知何时起已经改成永久有效了。于是又去中文外借室逛了一圈,还真找到几本感兴趣的书。其中一本是老毛子写的《深入实践Boost》,里面有一段讲到了Boost.coroutine,看了一遍不是很明白其中的用意,于是我又想起Lua中...…

Coding 全文阅读