首页 > 编程语言 >Json数据文件处理中遇到的一些问题总结(C++)

Json数据文件处理中遇到的一些问题总结(C++)

时间:2023-11-01 21:45:39浏览次数:36  
标签:join 数据文件 thread 静态 symbol upload C++ Json

一、海量数据处理的方法总结

参考CSDN技术贴:海量数据处理方法
C++面试必备-海量数据处理

二、快速Json文件解析的库

字节-json快速解析库

三、无锁队列

C++无锁队列

四、C++打包静态库

静态库和动态库
Linux-(C/C++)生成并使用静态库/动态库
c/c++依赖静态库、动态库符号问题
在远程linux服务器上运行C++的可执行文件时,常可能因为缺少对应版本的库而运行错误,因此需要打包静态库后上传运行。打包静态库的方法参照以下几个语句:

  1. 打包库需要的.o文件:
    g++ -c example/upload.cpp -o upload.o -I ./include

  2. 根据.o文件打包静态库:
    ar rcs libteam17.a upload.o

  3. 链接静态库生成可执行文件:
    g++ example/upload.cpp -o run_upload -static -Wl,--whole-archive -lpthread -Wl,--no-whole-archive -I ./include -L ./libteam17.a

  4. 运行可执行文件:
    ./run_upload "/data/data" 1694003473274 1694305049996

五、关于C++代码中使用了多线程std::thread,使用-static -lpthread静态编译后,运行段错误的问题。

解决方法参考本链接下的诸多回答
参考2

加强理解所以再整理一下:

在Linux下使用gcc静态编译程序,编译时没有任何告警或错误。但是编译完成运行可执行文件时,会报段错误(Segmentation fault)。
调用gdb调试之后把为题定位在std::thread,调用std::thread::join()或者std::thread::detach(),就会报段错误。
需要注意的是,常规动态编译之后运行,是不会报错的,只有编译静态库会出现这个问题;且这个问题只出现在linux下,Windows下使用MinGW不会报错;可以使用boost::thread代替std::thread,来暂时解决,但是治标不治本。

报错原因:目前这个问题只在ubuntu上存在,在Redhat系平台上不需要这样操作。因为pthread_join是weak symbol,默认静态链接找到第一个符号就不找了,而whole archive会把每个object file包含进来,那么当把strong symbol的pthread_join加进来之后,weak symbol的pthread_join会被strong symbol的“覆盖”掉,就可以避免段错误。但是在Redhat上,首先找到的就不是weak symbol,所以就不需要额外的处理。
ubuntu:

redhat:

解决办法:pthread_join的weak symbol 变成strong symbol。

  1. -lpthread字段后加上-Wl,--whole-archive -lpthread -Wl,--no-whole-archive
  2. 显示引用 pthread_join 来源
#include <thread>

void foo()
{
  printf("hello\n");
}

int main()
{
  auto* f = pthread_join;  // **!!!**
  std::thread t(foo);
  t.join();
}

六、其他程序问题可能导致的段错误总结

段错误原因及调试总结
C++段错误

七、如何调用gdb调试

关于gdb需要知道的技巧
gdb调试设置断点的方法
C/C++编程:gdb找出程序段错误位置
C/C++编程:linux下的段错误(Segmentation fault)产生的原因及调试方法(经典)

八、多线程,生产者-消费者模型

C++11多线程 创建多个线程、数据共享问题
生产者-消费者模型
C++多线程 链式、循环队列实现生产者消费者
两种实现形式

九、其他

Linux中使用nohup实现命令行日志输出
深度剖析开源分布式监控CAT

标签:join,数据文件,thread,静态,symbol,upload,C++,Json
From: https://www.cnblogs.com/ymfsy/p/17802681.html

相关文章

  • Python JSON 使用指南:解析和转换数据
    JSON是一种用于存储和交换数据的语法。JSON是文本,使用JavaScript对象表示法编写。Python中的JSONPython有一个内置的json包,可用于处理JSON数据。示例:导入json模块:importjson解析JSON-从JSON转换为Python如果您有一个JSON字符串,可以使用json.loads()......
  • C++类&对象
    C++类&对象C++在C语言的基础上增加了面向对象编程,C++支持面向对象程序设计。类是C++的核心特性,通常被称为用户定义的类型。类用于指定对象的形式,它包含了数据表示法和用于处理数据的方法。类中的数据和方法称为类的成员。函数在一个类中被称为类的成员。C++类定义定义一个类,......
  • mysql 5.7之后新增的json数据类型
    如图,可以直接把json数据存入mysql数据库,读取时也可以根据json中,属性名来读取。加上虚拟列,即可,如下图 ......
  • C++ 记录
    STL队列(queue),一个先进先出的容器,需要用到头文件queue。函数成员名功能返回值类型que.empty()判断队列是否为空,空返回真,非空返回假boolque.size()返回队列中元素个数unsignedlonglongque.push()将元素x放进队尾voidque.front()返回队首元素qu......
  • MSBUILD : error MSB3428: 未能加载 Visual C++ 组件“VCBuild.exe”。
    Buildingtheprojectsinthissolutiononeatatime.Toenableparallelbuild,pleaseaddthe"/m"switch.Buildstarted2021/3/170:22:07.Project"D:\t\node_modules\node-sass\build\binding.sln"onnode1(defaulttargets).Validat......
  • vscode使用SSH远程连接服务器并搭建c++环境
    环境:win10,vscode,一台linux服务器1.连接到远程平台在vscode上安装Remote-SSH插件,安装后左侧边栏会多出这样一个图标;点击这个图标,选择SSH右边的齿轮弹出一个窗口,选择第一个选项Host处填写远程服务器的名称(可以随便填),填写地址HostName,用户名User,端口Port。保存并刷新SSH列......
  • C++ ITK 读写.mha 文件
    如题:#include<iostream>#include<string>#include<itkImage.h>#include<itkImageFileReader.h>#include<itkImageIOFactory.h>#include<itkMetaImageIOFactory.h>#include<itkImageFileWriter.h>intmain(){//......
  • C++数据结构
    C++数据结构C/C++数组允许定义可存储相同类型数据项的变量,但是结构体是C++中另外一种用户自定义的可用的数据类型,它允许存储不同类型的数据项。结构用于表示一条记录,假设要跟踪图书馆书本的动态,可能需要跟踪每本书的下列属性:TitleAuthorSubjectBookID定义结构体......
  • 软件测试|Python对JSON的解析和创建详解
    简介JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,已经成为当今互联网应用中广泛使用的数据格式之一。Python提供了内置的模块来解析和创建JSON数据,使得在Python中处理JSON变得非常简单。本文将详细介绍Python对JSON的解析和创建过程,并提供示例代码来帮助大家更好......
  • C++基础杂记(2)
    将数组传入函数禁止修改数组的值函数的地址与函数的指针函数的指针数组函数的static与inline引用左值和引用传参C++11的数组for循环64位Linux操作系统中C++中常见基本类型所占字节数C++11类成员变量的初始化默认成员初始化器成员变量初始化列表委......