0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

为什么多线程编程这么难呢

jf_78858299 来源:码农的荒岛求生 作者:码农的荒岛求生 2023-02-24 13:51 次阅读

周末了,美美的睡个懒觉起来做早饭,做饭其实很简单,照着菜谱一步步来就行,没什么难度。

在你做饭时突然手机铃声大作,原来是线上出现了故障,其它同事正在排查,需要你协助一下,一边做饭一边打电话应该也不算太难,你可以的。

正当你一边排查问题一边做饭时本来约好明天来维修空调的师傅因为协调不开提前一天来了,你不得不一边做饭一边排查问题一边告诉维修师傅哪个空调坏了、问题是啥。。怎么样,是不是开始应付不过来了?

这还不算啥,就在这时你约好的同学也到了,一边接待同学一边指挥着维修师傅一边排查问题一边做早饭,你是不是已经开始疯了。

当多线程遇到共享

看到了吧,"多线程"绝不是在编程这个层面很难, 多线程本身就很难

尤其是当多线程遇上共享数据时更是难上加难,对人类来说,同时做两件互不干扰的事情还是有可能的,一边写代码一边听歌就是,但你可以试试让两个任务共享听的能力,同时听两首歌;或者让两个任务共享大脑的思考能力,一边解bug一边刷算法,你还能轻松加愉快吗?

如果你试图推演多线程访问共享数据那么你的脑海很可能就像刚才提到的“一边接待同学一边指挥这维修师傅一边排查问题一边做早饭”,一团糟。。人类的大脑似乎天生就不是很擅长(天才不在此讨论范围),更不用说因解决共享数据而带来的死锁等问题。

遇事不决量子力学

你的多线程代码可能在99.99%的情况下工作正常,但在小概率下就是会有问题,这都不算啥,问题是你该怎么debug呢?

你该怎么调试一个可能只有万分之一出错的程序呢?而且更棒的是,就像测不准原理一样,测量这操作本身竟然不可避免的搅扰了被测量粒子的运动状态,因此产生不确定性。

当你试图用调试器attach上去又或者加一些log时这本身也会改变多线程程序的行为,或者问题就此不再产生,又或者概率变为了十万分之一,从这个角度看多线程和量子力学有异曲同工之妙

这里的根源在于“ 可能性的组合爆炸 ”问题。

由于操作系统的调度、系统中断再加上程序员添加的锁等原因,我们的程序(线程)总是走走停停,这就导致在程序的“执行空间”上有太多可能,试图去测试每一种可能几乎是不可能的事情,而我们添加一些log等本身就给本来已经爆炸的组合新增一个维度,导致有的问题非常难复现。

尽管我们的调试工具IDE等越来越高级,但依然解决不了多线程本身的问题。

性能是个问题

如果你不关心程序性能的话,大可以加上一个很豪迈的锁,但锁也不应该加的过分放飞自我,你能想象为了让北京的某个同学买一本书电商要把整个华北地区的库存锁住吗?

如果你关心性能的话那么锁的粒度会是个问题,同时在硬件级别你可能需要了解多核cache一致性以及memory ordering等,这些都不是那么容易理解,更不用提无锁编程,lock-free等等。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6511

    浏览量

    87600
  • 多线程编程
    +关注

    关注

    0

    文章

    15

    浏览量

    6663
收藏 人收藏

    评论

    相关推荐

    labview多线程编程

    子曰:何为labview多线程编程
    发表于 03-11 15:46

    Linux多线程编程手册

    Linux多线程编程手册
    发表于 11-07 10:17

    嵌入式Linux多线程编程

    嵌入式Linux多线程编程-学习资源-华清远见清远见嵌入式学院:清远见嵌入式学院:《嵌入式应用程序设计》——第5 章 嵌入式Linux 多线程编程第5 章 嵌入式Linux
    发表于 11-05 06:54

    如何对Linux系统多线程进行编程

    Linux系统编程第07期:多线程编程入门 6年嵌入式开发经验,在多家半导体...
    发表于 12-23 08:08

    C++ 面向对象多线程编程下载

    C++ 面向对象多线程编程下载
    发表于 04-08 02:14 70次下载

    C++面向对象多线程编程 (pdf电子版)

    C++面向对象多线程编程共分13章,全面讲解构建多线程架构与增量多线程编程技术。第1章介绍了
    发表于 09-25 09:39 0次下载

    QNX环境下多线程编程

    介绍了QNX 实时操作系统和多线程编程技术,包括线程间同步的方法、多线程程序的分析步骤、线程基本程序结构以及实用编译方法。QNX 是由加拿大
    发表于 08-12 17:37 30次下载

    linux多线程编程课件

    电子发烧友为您提供了linux多线程编程课件,希望对您学习 linux 有所帮助。部分内容如下: *1、多线程模型在单处理器模型和多处理器系统上,都能改善响应时间和吞吐量。 *2、线程
    发表于 07-10 11:58 0次下载

    linux多线程编程开发

    本文中我们针对 Linux 上多线程编程的主要特性总结出 5 条经验,用以改善 Linux 多线程编程的习惯和避免其中的开发陷阱。在本文中,我们穿插一些 Windows 的
    发表于 12-26 14:24 55次下载
    linux<b class='flag-5'>多线程</b><b class='flag-5'>编程</b>开发

    MFC下的多线程编程

    计算机上的上位机制作工具语言之MFC下的多线程编程
    发表于 09-01 14:55 0次下载

    VC-MFC多线程编程详解

    VC编程中关于 MFC多线程编程的详解文档
    发表于 09-01 15:01 0次下载

    Windows多线程编程

    计算机上的上位机制作工具语言之Windows多线程编程,感兴趣的可以看看。
    发表于 09-01 15:27 0次下载

    什么是多线程编程?多线程编程基础知识

    摘要:多线程编程是现代软件技术中很重要的一个环节。要弄懂多线程,这就要牵涉到多进程。本文主要以多线程编程以及
    发表于 12-08 16:30 1.2w次阅读

    Linux中多线程编程的知识点

    Hello、Hello大家好,我是木荣,今天我们继续来聊一聊Linux中多线程编程中的重要知识点,详细谈谈多线程中同步和互斥机制。
    发表于 04-26 17:27 480次阅读
    Linux中<b class='flag-5'>多线程</b><b class='flag-5'>编程</b>的知识点

    mfc多线程编程实例

    (图形用户界面)应用程序的开发。在这篇文章中,我们将重点介绍MFC中的多线程编程多线程编程在软件开发中非常重要,它可以实现程序的并发执行,提高程序的效率和响应速度。MFC提供了丰富
    的头像 发表于 12-01 14:29 505次阅读