当前位置: 首页 > news >正文

[多线程]多线程编程需要注意的问题|多进程

可重入函数与不可重入函数

保证函数的可重入性的方法:

1)在写函数时候尽量使用局部变量(例如寄存器、堆栈中的变量);

2)对于要使用的全局变量要加以保护(如采取关中断、信号量等互斥方法),这样构成的函数就一定是一个可重入的函数。

满足下列条件的函数多数是不可重入(不安全)的:

1)函数体内使用了静态的数据结构;

2)函数体内调用了malloc() 或者 free() 函数;

3)函数体内调用了标准 I/O 函数。

如何将一个不可重入的函数改写成可重入函数呢?

1)不要使用全局变量。因为别的代码很可能改变这些变量值。

2)在和硬件发生交互的时候,切记执行类似 disinterrupt() 之类的操作,就是关闭硬件中断。完成交互记得打开中断,在有些系列上,这叫做“进入/ 退出核心”。

3)不能调用其它任何不可重入的函数。

4)谨慎使用堆栈。

https://blog.csdn.net/chenyefei/article/details/82682241

fork()的子进程和父进程有什么不同,子进程可以从父进程那里能够继承什么,又不能继承什么

《UNIX系统编程》第24章进程的创建

fork之后父子进程同时从fork点开始执行、

父子进程共享代码抄段,数据段都是完全拷贝,相互之间的更改zhidao不会影响。

(fork之后exec之前两个进程用的是相同的物理空间(内存区),子进程的代码段、数据段、堆栈都是指向父进程的物理空间,也就是说,两者的虚拟空间不同,但其对应的物理空间是同一个。)

但是值得注意的是socket是共享的

互斥锁

std::mutex mu;
// 使用锁保护
void shared_print(string msg, int id) {
    mu.lock(); // 上锁
    cout << msg << id << endl;
    mu.unlock(); // 解锁
}

有一个隐藏着的问题,如果mu.lock()mu.unlock()之间的语句发生了异常,会发生什么?unlock()语句没有机会执行!导致导致mu一直处于锁着的状态,其他使用shared_print()函数的线程就会阻塞。

void shared_print(string msg, int id) {
    //构造的时候帮忙上锁,析构的时候释放锁
    std::lock_guard<std::mutex> guard(mu);
    //mu.lock(); // 上锁
    cout << msg << id << endl;
    //mu.unlock(); // 解锁
}

RAII技术,即获取资源即初始化(Resource Acquisition Is Initialization)技术,这是c++中管理资源的常用方式。 //构造的时候帮忙上锁,(函数退出)析构的时候释放锁

相关文章:

  • 【开发者手册】开发者手册
  • 【C++11】C++11 多线程编程
  • 【多线程】c++11多线程编程(一)——初识
  • 【C++11】C++11 中的std::function和std::bind
  • 【多线程】c++11多线程编程(二)——理解线程类的构造函数
  • 【函数式编程】什么是函数式编程? C语言为何不是函数式语言?
  • 【多线程】c++11多线程编程(三)——竞争条件与互斥锁
  • 【多线程】c++11多线程编程(四)——死锁(Dead Lock)
  • 【多线程】c++11多线程编程(六)——条件变量(Condition Variable)
  • 【多线程】c++11多线程编程(五)——unique_lock和lock_guard
  • 【C/C++】内存和字符操作整理
  • 【知识】如何高效地在github上找开源项目学习?
  • 【mySQL】比explain更加详细的分析计划:Query Profiler
  • 【mySQL】mysql是行级锁还是表级锁
  • 【mySQL】提升mysql性能的关键参数之innodb_buffer_pool_size、innodb_buffer_pool_instances
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • 2017届校招提前批面试回顾
  • Android 架构优化~MVP 架构改造
  • Android优雅地处理按钮重复点击
  • Bytom交易说明(账户管理模式)
  • ComponentOne 2017 V2版本正式发布
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • Java多态
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • mysql常用命令汇总
  • Spring Cloud Feign的两种使用姿势
  • Vultr 教程目录
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 看域名解析域名安全对SEO的影响
  • 提醒我喝水chrome插件开发指南
  • 一份游戏开发学习路线
  • 应用生命周期终极 DevOps 工具包
  • 字符串匹配基础上
  • ​flutter 代码混淆
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​如何防止网络攻击?
  • (pojstep1.1.2)2654(直叙式模拟)
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (一)appium-desktop定位元素原理
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (一)RocketMQ初步认识
  • (转)平衡树
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .net framework profiles /.net framework 配置
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .Net接口调试与案例
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • ::前边啥也没有
  • [ solr入门 ] - 利用solrJ进行检索
  • [1204 寻找子串位置] 解题报告
  • [AutoSar]工程中的cpuload陷阱(三)测试
  • [C++] 默认构造函数、参数化构造函数、拷贝构造函数、移动构造函数及其使用案例