spdlog和fork冲突问题

2023-11-01

遇到个问题,使用spdlog的async_logger打印日志,一直都是正常的,但是调用了fork之后就不打印了

  • 先使用打印TODO大法,使用的spdlog的default_logger打印,走的console打印,结果发现console打印没问题,就async_logger在fork之后就不打印了

  • 使用strace -f运行看一下
    在这里插入图片描述
    这里的write 1就是console打印的,在fork前后都是正常的,但是write 3只在fork之前调用了,fork后没有调用,直接卡在了futex FUTEX_WAIT_PRIVATE,看来是死锁问题了

  • 大概率是async_logger的多线程打印出了问题,先看下spdlog的源码整理一下调用顺序

    • logger.h:125 ----> void logger::log(source_loc loc, level::level_enum lvl, string_view_t msg)
    • logger-inl.h:166 ----> void logger::log_it_(const spdlog::details::log_msg &log_msg, bool log_enabled, bool traceback_enabled)
    • async_logger-inl.h:27 ----> void spdlog::async_logger::sink_it_(const details::log_msg &msg)
    • thread_pool-inl.h:55 ----> void thread_pool::post_log(async_logger_ptr &&worker_ptr, const details::log_msg &msg, async_overflow_policy overflow_policy)
    • thread_pool-inl.h:76 ----> void thread_pool::post_async_msg_(async_msg &&new_msg, async_overflow_policy overflow_policy)
    • mpmc_blocking_q.h:32 ----> void enqueue(T &&item)
  • 在enqueue源码里面加点代码,在pop_cv_.wait前后加上打印,再strace -f运行一下
    在这里插入图片描述
    说明一下,修改.h文件需要make clean后重新编译一下才能生效,这里跟踪可以看到只打印了begin没有end,确实在这里卡死了

总结,由于async_logger使用了多线程从queue中读写日志消息,这里就加锁了,持有锁的是spdlog的线程池,我们调用fork在主线程中,这样只有主线程被继承下来成了子进程,虽然这些锁都被继承下来了,但是spdlog的线程池没有被继承下来,没有了持有者就没法释放,那么再入队列的时候就直接死锁了。可以参考下apue线程和fork,顺带一提,fork不继承文件锁,所以想用文件锁来判断进程是否单实例启动,在fork后就不生效了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spdlog和fork冲突问题 的相关文章

  • 在 C(非 C++)中使用 fork() 从 1 个父级中生成 3 个子级

    您好 我一直在开发一个程序 该程序会分叉孩子 稍后将从每个孩子中分叉出更多的孩子 但这不是我需要帮助的 当我运行我的程序时 在这里它是一个函数 但工作原理相同 我应该有一个父级 PPID 生成 3 个子级 PIDS 1 2 3 但我得到的是
  • 在 C 客户端服务器应用程序中,socket() 返回 0

    我正在开发一个应用程序 其中包含多个服务器套接字 每个服务器套接字都在唯一的线程中运行 外部实用程序 脚本 由线程之一调用 该脚本调用一个实用程序 客户端 该实用程序将消息发送到服务器套接字之一 最初 我使用的是system 来执行这个外部
  • 我可以将 git 上的分叉项目更新为原始/主副本吗?

    几周前 我在 GitHub 上分叉了一个公共项目 今天 我想尝试一些东西 但我想确保我使用的副本是最新的 我可以先更新我的前叉吗 如果在我开始更改后对叉子进行更改 会发生什么情况 我可以再次更新我的分叉 同时将我的更改保留在那里 即合并 如
  • 如何杀死shell的所有子进程?

    我正在编写一个 bash 脚本 它可以完成几件事 一开始它会启动几个监视脚本 每个脚本都运行一些其他工具 在我的主脚本结束时 我想杀死从我的外壳中产生的所有东西 所以 它可能看起来像这样 bin bash some monitor1 sh
  • fork 如何与逻辑运算符一起使用

    main if fork fork fork printf AA n else if fork printf BB n else printf CC n 我运行了以下代码并得到结果 AA AA CC BB CC BB 虽然我了解 fork
  • 在后台运行 Ant 目标而不使用spawn=true

    我想在后台启动一个服务器 返回并执行一些其他目标 然后在 Ant 完成执行所有目标时停止服务器 我提出了以下两种解决方案 但它们都阻止 Ant 执行后续目标 因为我希望进程最终终止 所以我不想使用spawn true 还有其他解决办法吗
  • 与 fork() 共享堆内存

    我正在努力用 C 语言实现一个数据库服务器 它将处理来自多个客户端的请求 我在用fork 处理单个客户端的连接 服务器将数据存储在堆中 堆由指向动态分配记录的哈希表的根指针组成 记录是具有指向各种数据类型的指针的结构 我希望进程能够共享这些
  • 与 fork() 混淆

    我很难理解 fork 命令在不同场景下的作用 这是我书中的一些示例代码 int main int a 12 int b 9 int fid fork if fid 0 a else wait NULL b b 5 printf progra
  • GCC 声明: typedef __pid_t pid_t?

    我对 例如 pid t 的声明感到困惑 pid t 是什么意思 它是其他地方定义的另一种类型吗 如果是 在哪里 为什么我的 types h 在 ubuntu 13 04 64 位中定义 pid t 如下 ifndef pid t defin
  • UNIX fork 之后,指向动态分配内存的指针会发生什么情况?

    有人请澄清 fork 之后指针会发生什么 据我了解 指向堆栈上或静态分配的任何内容的指针都是相对于堆栈 数据段寄存器的 因此在分叉期间准确复制它们是可以的 但是 如果我在 fork 之前 malloc 某些东西会发生什么 例如 void p
  • C: dup2、pipe 和 fork 未按预期工作

    我正在尝试做一个简单的 fork gt 执行另一个程序 gt 向该子进程说 你好 gt 读回一些内容 gt 打印收到的内容 用作子程序的程序只是等待任何输入行并将某些内容打印到标准输出 例如 你好 这是我的 主机 程序 不起作用 inclu
  • fork 后调试子进程(配置了 follow-fork-mode 子进程)

    我正在开发一个应用程序 父级分叉子级来处理某些任务 我遇到一个问题 我已将 gdb 配置为 follow fork mode 子级 但在 fork 后 到达断点后 它发送 SIGTRAP 但子级以某种方式终止并向父级发送 SIGCHLD 我
  • 对于有多个孩子的单亲,正确使用 fork() 和 pipeline() 。我该如何正确地做到这一点?

    So my 上一篇文章 https stackoverflow com questions 26321100 concept any good c example of fork pipe where one parent creates
  • 解释这段代码的工作原理;子进程如何返回值以及在哪里返回值?

    我不明白子进程如何返回该值以及返回给谁 输出为 6 7 问题来源 http www cs utexas edu mwalfish classes s11 cs372h hw sol1 html http www cs utexas edu
  • Woocommerce:添加第二个电子邮件地址不起作用,除非收件人是管理员

    我尝试了多种方法来向 Woocommerce 电子邮件添加其他收件人 但它似乎仅适用于主要收件人是管理员的测试订单 这些是我尝试过的片段 如果订单的客户是管理员 则电子邮件将发送到这两个地址 如果订单包含客户电子邮件地址 则仅发送至该电子邮
  • 父进程和子进程如何进行信号量操作?

    semget 调用是否在父进程和子进程之间共享信号量 我有这段代码 对于相同的代码 我观察到如果父进程首先运行 子进程有时会获得更改后的信号量值 但是当子进程首先运行时 父进程似乎永远不会携带更改后的信号量 为什么会发生这种情况 谁能向我解
  • 为什么“fork()”调用没有在无限循环中优化? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 考虑到 C 11 1 10 24 in intro multithread 该实现可以假设任何线程最终都会执行以下操作之一 终止 调用
  • C中的pipe()和fork()

    我需要创建两个子进程 一个子进程需要运行命令 ls al 并将其输出重定向到下一个子进程的输入 而下一个子进程又将对其输入数据运行命令 sort r n k 5 最后 父进程需要读取该数据 已排序的数据 并将其显示在终端中 终端中的最终结果
  • 如何杀死叉子的孩子?

    我有以下创建子叉的代码 我想在子进程在父进程中完成执行之前杀死它 怎么做 include
  • Linux/POSIX:为什么 fork() 不分叉*所有*线程

    众所周知 POSIX下创建新进程的默认方式是使用fork 在 Linux 下 这在内部映射到clone 我想知道的是 众所周知 当一个人打电话时fork 子进程是用单个线程创建的 调用的线程fork cf https linux die n

随机推荐

  • 产品研发流程

    需求管理流程介绍 1 1需求管理流程 产品研发的生命周期 一般需要以下几个环节 1 2常用的调研方法 1 3如何进行访谈 访谈注意事项 1 列调研大纲 根据大纲去调研 2 调研顺序 先流程后细节 1 流程从哪里开始 由谁发起 什么事情触发的
  • 想入手抖音定制生日祝福短视频,没有创意思路怎么办?几个方面带你了解整个流程

    项目 定制派大星生日祝福视频 原理 从抖音引流到微信转为私域流量 成本 一部手机 一个微信小号 需要的资源 配音声优 视频素材 一个抖音号 剪辑工具 剪映 这是一个淘宝商品改造成抖音的玩法项目 一 需求思路 儿童喜欢看的动画片人物 比如 派
  • ubuntu16.04开起wifi热点

    1 首先保证电脑连接有线网络 2 点击电脑屏幕右上方联网图标 选择最后一个选项 编辑连接 3 进入如下页面 选中选中wifi选项 点击添加 4 进入如下页面 选择连接类型为wifi 点击新建 5 进入如下页面 填写连接名称与SSID 这两项
  • java深度克隆工具类——支持对象和对象集合

    正经学徒 佛系记录 不搞事情 第一步 创建工具类 直接使用commons beanutils实现对象拷贝 引入pom
  • mysql数据库存储逻辑_MySQL逻辑架构及存储引擎简介

    MySQL逻辑架构 并发控制 由锁实现 读锁 也叫共享锁 读锁互相不阻塞 A加锁表后A b c d都能读该表但不能写该表 写锁 也叫排他锁 写锁相互阻塞 A加排他锁后 其他线程不能读写该表 锁粒度 表锁 锁一个表 并发粒度小 代表存储引擎M
  • Blazor 模板化组件开发指南

    翻译自 Waqas Anwar 2021年4月15日的文章 A Developer s Guide To Blazor Templated Components 1 在我之前的一篇文章 Blazor 组件入门指南中 我介绍了组件参数 并向您
  • javascript 转数字:javascript数字相加

    var a 3 var b 98 c a b 想得到c 101 确变成了字符串拼接 得到了398 我该则么做呢 c parseInt a parseInt b
  • #pragma once 与 #ifndef

    在C C 中 使用 include 包含文件的时候 经常使用方法去防止重复引用 产生二义性 通常有两种方式 第一种 ifndef指令方式代码被重复引用 比如说 ifndef CODE BLOCK define CODE BLOCK code
  • 谈文本分类

    本文来自对 文本分类研究综述 汪岿的阅读 文章目录 1 为什么要进行文本分类 2 文本分类的分类 应用 3 当前文本分类面临的挑战 4 文本分类的前景 1 为什么要进行文本分类 在大数据时代 网络上的文本数据日益增长 采用文本分类技术对海量
  • 04-Java框架-MyBatis

    一 MyBatis的介绍 1 1 回顾一下JDBC 下面这个代码是使用JDBC实现基于id查询员工信息 我们来分析分析有什么弊端 public Employee selectById Long id Connection conn null
  • 【解决】pytorch单机多卡问题:ERROR: torch.distributed.elastic.multiprocessing.api:failed

    最近在使用单机多卡进行分布式 DDP 训练时遇到一个错误 ERROR torch distributed elastic multiprocessing api failed 而实际报错的内容是 ValueError sampler opt
  • LeetCode·每日一题·722. 删除注释·模拟

    题目 示例 思路 题意 gt 给定一段代码 将代码中的注释删除并返回 由于注释只有两种类型 字符串 表示行注释 表示 和其右侧的其余字符应该被忽略 字符串 表示一个块注释 它表示直到下一个 非重叠 出现的 之间的所有字符都应该被忽略 阅读顺
  • Vuforia AR学习

    传送门 1 搜索 Vuforia 下载相关 SDK 和 Samples 2 这个就有点坑了 想运行 sample demo 需要把下载好的sample拷贝至sdk目录下的sample文件夹下 如图 3 也可以修改修改 Samples dem
  • Linux中nginx配置ssl证书实现https访问(nginx-1.16.1为例)

    配置ssl证书之前 先准备好SSL证书 至于获取的途径很多 不清楚的可以自行搜索 也可以留言 准备好证书后 找到nginx的安装目录 我的安装位置为 usr local nginx 1 16 1 进入 conf nginx conf 编辑n
  • 数据结构:哈夫曼树算法(内含Select函数算法解析)全网最全解释

    引言 学习数据结构的都应该清楚 哈夫曼树是书章节的最后一个内容 也是相对重要的一个知识 他可以应用在生活的各个例子中 如下图所示 假设有ABCD 四个货物架D货架物品被人购买的概率是20 C货架是 35 B货架是 60 D货架是80 那么显
  • python 数组-(列表遍历)(元素互换)

    lisName 张三丰 李四 王麻子 饭桶 遍历列表中所有元素 print 20 for obj in lisName print obj print 20 通过 下标 索引获取值 for i in range 0 len lisName
  • blender快捷键

    tab 模式切换 可以shift多物体切换 主键盘 1点 2线 3面 按住shift 点击点面 可以多选 或者shift 1 2 3多选 ctrl alt q 四象视图 小键盘1前 3右 7顶 9切换前后 也可以按crl 1后视图 小键盘
  • STL系列之十 全排列(百度迅雷笔试题)

    转载自 http blog csdn net morewindows article details 7370155 全排列在笔试面试中很热门 因为它难度适中 既可以考察递归实现 又能进一步考察非递归的实现 便于区分出考生的水平 所以在百度
  • GlidedShy 第一题 实现自动登录和数据爬取

    python 自动登录 控制以及接管浏览器 爬取信息练习 GlidedShy官网 爬虫练习网站 代码仅供学习参考 功能实现步骤 自动登录 输入账号密码 选择题目 爬取数据 自动提交后返回 验证邮箱 注册时已人工验证 框架 Seleium控制
  • spdlog和fork冲突问题

    遇到个问题 使用spdlog的async logger打印日志 一直都是正常的 但是调用了fork之后就不打印了 先使用打印TODO大法 使用的spdlog的default logger打印 走的console打印 结果发现console打