随笔日记: 一个daemon程序,它的pthread_join()经常意外返回, 很是奇怪!

智能车竞赛蚂蚁搬家组:NXP-MicroPython与STC单片机协同搬运策略解析 本文深入解析智能车竞赛蚂蚁搬家组中NXP-MicroPython与STC单片机的协同搬运策略。通过硬件选型、通信架构设计、效率优化及实战经验分享,展示了如何利用NXP-MicroPython的实时控制与STC单片机的感知导航优势,实现高效多智能体协同作业,为参赛团队提供实用技术参考。 阅读详情
 


TcpServer_Listener::Initialize() {
  ...
    pthread_create(&_ptThreadHandleAccept, NULL, AcceptThread, (void *)this);
}

void*
TcpServer_Listener::AcceptThread(void* pParam)
{
    pthread_detach(pthread_self());
    dbg_Printf(" TcpServer_Listener::AcceptThread Pid=%d.", getpid());    //print pthread_t is meaningless!

    TcpServer_Listener *pListener = reinterpret_cast<TcpServer_Listener *>(pParam);
    pListener->_bRunning = true;
    pListener->AcceptFunc();

    dbg_Printf(" TcpServer_Listener::AcceptThread Pid=%d exit.\n", getpid()); 
    return 0; // We never reach this point
}   

TcpServerListener::AcceptFunc(void)
{
    dbg_Printf("TcpServer_Listener enter listening loop");          // (1)
    while(true) {
        // 用 select 函数监听并接受连接
        // 如果有错误发生, 执行 break;
 }
    dbg_Printf("TcpServer_Listener enter listening loop");          // (2)
 return;
} 


void TcpServer_Listener::WaitAcceptThreadEnding()
{
    if(_ptThreadHandleAccept != 0) {
        pthread_join(_ptThreadHandleAccept, NULL);
        dbg_Printf(" Accept(listening) thread finished!");                 // (3)
    }
}

int main(int argc, char* argv[]) {
       
  ... //do other jobs
  
 CdnDir_Listner  listener;
 if (!listener.Initialized(CDN_DIR_IP, CDN_DIR_PORT)) {
        dbg_Printf("Server exit because failed creating listener");
        return 1;
    }
    dbg_Printf("Server running...");                                                       // (4)
    listener.WaitAcceptThreadEnding();
 return 0;
}

   现在运行中遇到一个问题, 偶发的:
       AcceptThread 线程还没有退出( 从代码(2)处的 log没有打印出来看出来的 ),
   但是, 整个main程序会没等到 AcceptThread 结束就退出了,打印出了代码(3)处的log。
  
  
   下面的两组信息分别是正确时、 错误时的:
  
   正确时的:
/home/work # ./cdn_dir_daemon &
     。。。    。。。
[ cdn_dir_daemon_c2 info ] [FILE: cdn_dir.cpp, Func: main() ]Server running...
[ cdn_dir_daemon_c2 info ] [FILE: bxLite_tcp_utils.cpp, Func: AcceptThread() ] TcpServer_Listener::AcceptThread Pid=11143.
[ cdn_dir_daemon_c2 info ] [FILE: bxLite_tcp_utils.cpp, Func: AcceptFunc() ] TcpServer_Listener enter listening loop


    出错时的:
/home/work # ./cdn_dir_daemon &
   。。。    。。。
[ cdn_dir_daemon_c2 info ] [FILE: cdn_dir.cpp, Func: main() ]Server running...
[ cdn_dir_daemon_c2 info ] [FILE: bxLite_tcp_utils.cpp, Func: AcceptThread() ] TcpServer_Listener::AcceptThread Pid=11130.
[ cdn_dir_daemon_c2 info ] [FILE: bxLite_tcp_utils.cpp, Func: AcceptFunc() ] TcpServer_Listener enter listening loop
[ cdn_dir_daemon_c2 info ] [FILE: bxLite_tcp_utils.cpp, Func: WaitAcceptThreadEnding() ] Accept(listening) thread finished!


       怎么会这么就退出了呢??? 
   
    如果AcceptFunc中没有发生socket错误,那么AcceptThread是不会退出的。
   
    可是我在AcceptFunc中会发生socket错误的地方都有log打印。而看到的出错时的log并没有看到。
 
        我后来在AcceptFunc中用 try{}catch(...) { dbg_Print("A unknown exception happen")} , 也是没看到AcceptThread线程退出而pthread_join()就返回了!!!
  
  很奇怪啊...
  
  

MiniQMT国债逆回购策略Python代码全解析 通过本文的介绍,我们不仅学习了如何在MiniQMT平台上使用Python编写国债逆回购策略,还对策略的逻辑构建、代码实现以及风险管理有了深入的了解。国债逆回购策略是一种适合初学者的低风险投资方式,希望本文能帮助你在量化交易的道路上迈出坚实的一步。 阅读详情

相关推荐

HALCON实战:用两个工业相机实现无缝大视野拼接(附完整代码与避坑指南)

本文详细介绍了使用HALCON软件实现双工业相机图像无缝拼接的完整解决方案,涵盖硬件配置、相机标定、坐标系转换和图像拼接等关键步骤。通过高精度标定和矩阵变换技术,可构建大视野检测系统,适用于液晶面板、PCB等工业检测场景,显著提升检测效率和精度。

weixin_29050513的博客 191

daemon和pthread_create之间的问题(线程阻塞)

这样就导致,463编译的软件,调用之后daemon之后,主线程就直接退出了,当我们调用pthread_create函数之后,会发唤醒消息给pthread_initialize记录的pid线程时,让他继续执行。首先第一点,我们之前一直听过一句话,main函数是程序的入口,其实并不是的。最近完成工具链和uClibc库升级的任务,升级之后出现了一个bug,就是大软件起来之后,原先ps能看到6个线程的进程,现在只能看到三个,导致出现了一些功能上的问题。综上所述,用了新的工具链之后出现问题,主要的原因是由于,

点滴路程 1193

【全网最新】使用 1panel面板 部署若依系统( springboot 和 vue)项目

打开前端项目的vue.config.js文件,检查devServer下的proxy代理部分,然后将下面这个端口修改为你要在打包后访问的端口,即使用nginx代理前的接口。这个端口默认是80端口,这里把其修改为不会冲突的8010端口,后台接口的地址配置为9080,不过感觉这里设置的8010和9080可能没有用,因为部署前端静态页面是,也配置了一次网页的外部接口和api的接口,后期有空了再验证。打开右侧的Maven,点击:生存期->package,然后点击运行,等待打包成功,包在如图所示的文件夹中。

老薛的专栏 1756

pthread_dedach()注意事项

线程为分离态的注意,如上图所示。

modi000的博客 453

告别Qweb!用ReportBro在Odoo 13-19版本中5步搞定动态报表

本文介绍了如何在Odoo 13-19版本中使用ReportBro替代Qweb快速实现动态报表设计。通过5步集成指南,包括环境准备、前端集成、后端服务搭建等,展示了ReportBro在可视化设计、即时预览和多格式输出(PDF/XLSX)方面的优势,显著提升开发效率和报表灵活性。

mac99的博客 800

手把手教你用Simulink搭建级联H桥储能变流器仿真模型(附SOC均衡分析)

本文详细介绍了如何使用Simulink搭建级联H桥储能变流器仿真模型,并附有SOC均衡分析。从仿真环境准备、单相H桥单元建模到多模块级联方案和SOC均衡策略实现,逐步指导读者完成复杂系统的构建与优化。通过关键仿真结果分析和工程实践问题排查,帮助读者掌握级联H桥储能变流器的核心技术与应用方法。

weixin_42524226的博客 446

linux下c程序 daemon、fork与创建pthread的顺序问题

linux下c程序 daemon、fork与创建pthread的顺序问题

mojolang 2942

【COMSOL超材料和超表面仿真设计】

超材料和超表面的设计通常需要自定义材料属性。在COMSOL中,可以通过定义介电常数和磁导率的张量来模拟超材料的特性。对于超表面,通常需要定义表面阻抗或等效电路模型。

weixin_51101456的博客 1667

Linux系统编程08---守护进程与线程

Linux系统编程08—进程与线程

骊山道童的博客 1347

达芬奇Pro开发板硬件验证全流程指南

FPGA开发板硬件验证是嵌入式系统可靠性的基石,其核心在于理解SoC启动时序、IO资源映射与高速接口物理层约束。基于Xilinx Zynq-7000异构架构的开发平台,需围绕电源完整性、时钟稳定性、信号完整性及软硬协同启动链路展开分层测试。技术价值体现在规避量产失效率、支撑高可靠工业控制与实时图像处理等场景。典型应用涵盖千兆以太网通信验证、DVP摄像头与RGB LCD显示链路调试、以及SFP+光纤接口PRBS误码率测试。本文聚焦达芬奇Pro系列开发板,深入解析JTAG下载、QSPI Flash重烧录、RGM

weixin_42453228的博客 123

用Python实现古诗词填字游戏(三)

古诗词做填字游戏的第三部分代码,也是最核心的部分。实现对诗文和关键字的选定,并确定文字的输出位置。

PosPro的专栏 6117

linux中的多线程

线程概念 什么是线程(面试必考) (1)进程 进程是程序的一次执行过程,是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,每一个进程都有一个自己的地址空间,至少有 5 种基本状态,它们是:初始态,执行态,等待状态,就绪状态,终止状态。 (2)线程 线程是CPU调度和分派的基本单位,它可与同属一个进程的其他的线程共享进程所拥有的全部资源。 (3)联系 线程是进程的一部分,一个线程只能属于一...

BuZiShuoquoto的博客 277

RK356x U-Boot研究所(命令篇)3.7 pci与nvme命令的用法

RK356x U-Boot研究所(命令篇)3.7 pci与nvme命令的用法

Systemcall名屋 2084

【Linux】连接已终止的线程(pthread_join)、线程的分离(pthread_detach)、线程取消(pthread_detach)

连接已终止的线程(pthread_join)、线程的分离(pthread_detach)、线程取消(pthread_detach)

mhyasadj的博客 1199

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

c语言 free函数报段错误,pthread_join 函数报段异常 ?

pthread_join 函数报段错误 ??????#include#include#includevoid*thread_fn(void*);structfoo*foo_aloc(void);voidfoo_hold(structfoo*);voidfoo_rele(structfoo*);voidmy_err(char*);structfoo{intf_count;...

weixin_39570530的博客 447

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

pthread的pthread_join()函数理解实验

一、使用方式 pthread_t tid; pthread_create(&tid, NULL, thread_run,NULL); pthread_join(tid,NULL); 创建线程之后直接调用pthread_join方法就行了。 二、为什么要使用pthread_join()         在很多情况下,主线程生成并起动了子线程,如果子线程里要进行大量的耗时的运算,

A cyclist amateur photographer 4万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Linux 多线程pthread_join(tid)返回值为22原因.

首先直接说明为什么返回值是是22,。 若线程的状态是,unjoinable状态的线程,这些资源在线程函数退出时或pthread_exit时自动会被释放。 如果线程是joinable状态,只有当你调用了pthread_join之后这些资源才会被释放,也就是说只有不设置unjoinable状态时pthread_join才有效,当线程函数自己返回退出时或pthread_exit时都不会释放线程所占用

lianxianxun230的博客 6882

pthread_join的段错误

运行的时候能够打出三行AAAA

runfan1014的专栏 8106

python异步socket编程之二

三、异步client与异步server的通信 1. 服务端代码 pythone socket的server段,开放三个端口:10000,10001,10002. 例子中是每个server绑定一个端口,测试的时候需要分别开3个shell,分别运行. 这太麻烦了,就分别用三个Thread来运行这些services #!/usr/bin/env python # # -*- codin

北雨南萍 5159

Linux下pthread多线程函数入门

转载自:https://blog.youkuaiyun.com/orzorz/article/details/5439780 1、概述 多线程程序作为一种多任务、并发的工作方式,有以下的优点: 提高应用程序响应。这对图形界面的程序尤其有意义,当一个操作耗时很长时,整个系统都会等待这个操作,此时程序不会响应键盘、鼠标、菜单的操作,而使用多线程技术,将耗时长的操作(time consuming)置于一个新的线程,可以避免这种尴尬的情况。 使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不

bjtuwyq的博客 1580

pthread_join()详解及实验

pthread_join()函数原型: int pthread_join(pthread_t thread, void **retval); args: pthread_t thread: 被连接线程的线程号 void **retval : 指向一个指向被连接线程的返回码的指针的指针 return: 线程连接的状态,0是成功,非0是失败 1.为什么要使用pthread...

EmbeddedCoder 的优快云博客 3万+

列出tar压缩包中的第一级目录

相信很多人经常会需要在不解压的情况下,了解一个tar包的根目录的信息。  这个通过  tar 配合简单的 grep, awk命令就能实现。     今天突然想记录下其中的技巧供自己和大家日后参考。 很久没有写博客了,不知道是哪根筋恢复正常了 bell@bell-desk

code_think_write的专栏 9179

关于错误: error: variable ‘QApplication app’ has initializer but incomplete type

#include #include #include #include #include class MainWindow : public QMainWindow { public: MainWindow(); protected: bool eventFilter(QObject *obj, QEvent *ev); private: QT

code_think_write的专栏 8856

一个在拷贝动态库时有用的cp -d ,让你保留链接文件

在完成一个库并准备发布的时候,我们通常会拷贝它到一个整理目录下,像这样:cp bin/libXXX.so*  $DEST_DIR 可是,这样的结果是,原本是soft-link的文件,都变成了‘实’文件。 这个结果有2点不好: 一是占用了磁盘空间;  二是, 有时候会让你犯错误。   我今天就遇到(以前也直接cp,但没出现今天的情况)问题了。 首次执行了 cp bin/libXXX.so*

code_think_write的专栏 6480

一条命令找出存在 swp/swo 恢复文件的文件原名

有时候vim由于突然死机等原因,会留下一堆 swp/swo文件, 这时候如果一个命令就能获得所有swp文件对应的原文件名,是很有用的!   方法应该是很多的,这里给个例子,抛砖引玉。   bbb=`ls .*sw* | sed -e "s,\.\(.*\)\.swp,\1,"` # 处理原文件: for f in $bbb;do echo $f"--";done

code_think_write的专栏 6438
上一篇: Python中 命令行参数传递 与 处理
下一篇: 嵌入式板子上的ps的输出,有点意思
code_thin_write
博客等级 码龄17年 1粉丝 24原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值