You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多线程应用中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 23:26:28