多线程应用中alarmsThread无法持续调度或启动的问题求助
线程调度异常排查请求
问题背景
在多线程应用中创建了alarmsThread,该线程作为TCP客户端连接远程服务器,核心逻辑为每隔10秒休眠后唤醒,检查并发送告警至服务器。但出现以下异常:
- 线程运行数秒后停止被调度,仅偶尔在数秒/数分钟内被调度
- 若在线程函数开头添加约60秒延迟睡眠,线程有时完全无法启动
线程创建代码
schedulerParam.sched_priority = PRI_MIDDLE; pthread_attr_init(&pThreadAttrAlarms); pthread_attr_setinheritsched(&pThreadAttrAlarms, PTHREAD_EXPLICIT_SCHED); pthread_attr_setdetachstate(&pThreadAttrAlarms, PTHREAD_CREATE_JOINABLE); pthread_attr_setschedpolicy(&pThreadAttrAlarms, SCHED_RR); pthread_attr_setschedparam(&pThreadAttrAlarms, &schedulerParam); pthread_attr_setscope(&pThreadAttrAlarms, PTHREAD_SCOPE_SYSTEM); printf("Going to create alarms thread.\n"); err = pthread_create (&alarmsThread, &pThreadAttrAlarms, alarmsThreadFunc, NULL); if(err < 0) { perror("Error: alarms thread create error\n"); printf("Error: alarms thread create error, err:%d \n", err); return 0; } pthread_setname_np(alarmsThread, "alarmsThrd"); // 绑定到核心0运行 setThreadAffinity(alarmsThread); pthread_join(alarmsThread, NULL);
异常现象
- 线程未被调度时,
ps -T输出显示状态为S(可中断休眠):1915 root 749m S {alarmsThrd} //bin/controlplaneapp 0 0 - 在线程函数开头添加60秒
sleep后,线程有时无法启动(通过控制台打印确认)
线程函数核心逻辑
while (1) { if(1 == EMS_CONN_STATE) retVal = sendPendingAlarms(sockfd); checkForAlarms(sockfd); if (0 == EMS_CONN_STATE) { retVal = connectToEms(&sockfd, nmsPort, nmsHostIp); } sleep(10); }
排查建议
- 检查核心亲和性与负载:线程被绑定到核心0,需确认该核心是否被其他高优先级线程/进程占满。可执行
top -H -p <进程PID>查看核心0上所有线程的CPU占用,临时注释setThreadAffinity调用,观察线程调度是否恢复正常。 - 调度优先级验证:使用
SCHED_RR调度策略时,若核心0存在更高优先级线程,会抢占当前线程的CPU时间。执行ps -eLo pid,tid,cls,pri,cmd查看所有线程的调度类别和优先级,确认PRI_MIDDLE的数值是否合理,是否低于核心0上其他线程的优先级。 - 排查阻塞调用:线程状态
S表示处于休眠,需检查sendPendingAlarms、checkForAlarms、connectToEms中是否存在未设置超时的阻塞操作(如TCP连接、send/recv未配置SO_RCVTIMEO/SO_SNDTIMEO),这类操作会导致线程长时间休眠。 - 主线程阻塞问题:主线程调用
pthread_join会阻塞至alarmsThread结束,若主线程还有其他初始化逻辑,可能因此被阻塞。尝试将pthread_join移至主线程的最后执行阶段,避免影响其他线程初始化。 - 全局变量同步检查:若
EMS_CONN_STATE是全局变量,需确认是否用互斥锁保护访问,数据竞争可能导致线程逻辑异常进入错误分支,引发阻塞。 - 资源泄漏排查:长期运行后检查是否存在文件句柄或内存泄漏,可执行
lsof -p <进程PID>查看打开的文件描述符,或用valgrind分析内存使用情况,资源耗尽可能导致线程无法正常调度。
内容的提问来源于stack exchange,提问作者Ravi
相关产品推荐
相关产品推荐

