求助:CentOS 上线程无法得到执行的问题

hixj1976 2017-07-26 11:57:18
求助各位大神,我是 linux 新手,对遇到的问题完全没有头绪。

我写了一个服务程序运行在 CentOS 上,但是发现不定期的(大约一个月出现1、2次)会有某个线程得不到执行。一旦这个问题出现,大多数时候守护进程也是挂起的。由于代码是很复杂的,所以下面我用简化的逻辑来描述一下:

main()
{
// 1. 初始化一些变量、初始化日志文件

// 2. 设置信号处理回调函数

// 3. 转化为守护进程(也就是 fork 两次,但是没有关闭标准输入输出)

// 4. 使用 pthread_create、pthread_detach 创建其它线程 A、B、。。。Z (数量不定,这里只是示例)

// 5. 循环等待退出信号 quit_signal,这个变量在收到 SIGTERM 时被设置为 true
unsigned char check_alive = 0;
while (!quit_signal)
{
check_alive++;
if (0 == check_alive) Log("Main task is alive.");
usleep(1000000);
}
Log("Server is going to stop...");

// 6. 停止线程 A、B、。。。Z,然后退出
}

主要问题:

(1)我有其它的脚本会检测这些线程中的一些输出,有时会发现线程 A、B、。。。Z 中的某个没有在运行。这种时候,我给进程发送 SIGTERM 信号,通过日志,我能够看到进程接收并处理了 SIGTERM 信号,并且 quit_signal 被设置为了 true。按照道理来说,我应该在日志中看到 "Server is going to stop..." 这句话,但是没有!说明这个时候守护进程也没有得到执行!

(2)守护进程会每隔 255 秒在日志文件中写入 "Main task is alive." 这句话。但是有时候,这句话从某个时间点后再也看不到了,说明从那个时间点开始,守护进程再也没有得到执行。

我对此毫无头绪。请教各位大神,什么情况会造成这种结果?或者,我该怎样去寻找问题的根源所在?
先谢了!
...全文
232 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
hixj1976 2017-08-05
  • 打赏
  • 举报
回复
问题原因已经找到。在守护脚本中重启程序前打印了调用栈,发现是信号处理中malloc重入造成了死锁。malloc是str::string的操作中被调用的。具体可以参考这篇博客文章,讲的很详细:http://blog.csdn.net/icycode/article/details/49645725
LubinLew 2017-07-29
  • 打赏
  • 举报
回复
1.日志输出 使用 syslog 保证可靠性 2.在每个线程中加日志,看看最后挂起再哪个线程上,
hixj1976 2017-07-27
  • 打赏
  • 举报
回复
另外,有时候连 SIGTERM 都收不到(因为我在 SIGTERM 的处理函数中会写调用 Log() 写日志,但是我执行 kill PID 后根本看不到相关的日志输出)。
hixj1976 2017-07-27
  • 打赏
  • 举报
回复
补充说明一下,上面代码中的 Log 应该是线程安全的,主要是调用一下 localtime_r、写一个公用的内存区(未做同步保护)、然后把内存区的数据写入文件。因为考虑速度问题,里面没有用锁做同步。

23,118

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧