首页 > 其他分享 >为什么要有线程?

为什么要有线程?

时间:2024-02-09 12:22:44浏览次数:30  
标签:为什么 文本编辑 请求 线程 内存 进程 txt

这是我学习时一直想不通的问题。尽管很多书籍和视频都做了解释,但由于没有实际的案例和场景,导致我不能真正明白这个问题。接下来说下我的迷思,以及迷思的答案。
线程可以有效配合多核处理器,提高效率。这个是最广泛的说法,对于网络服务器,对于每个请求创建一个线程,可以CPU同时处理多个请求。我的疑问是,每来一个请求,就创建一个进程,多创建几个进程,也可以同时处理多个请求啊。网络请求大部分都是增删改查,从磁盘或者其他进程中获取数据,或处理后返回,或直接返回。为什么一定需要线程?
后面我看了一个例子,就清楚为什么进程里面一定要有线程,那就是文本编辑。
目前文本编辑(方便叙述,文本用txt代替)一般都需要三个线程
1)显示线程,读取内存中的txt,向用户展示当前内容。
2)操作线程,在用户输入指令后,做出的响应。如用户粘贴一行文本,本线程就需要将对应的文本加入到内存的txt中。
3)自动保存线程,定时把内存中的txt写入到磁盘中。
由于线程共享进程的内存,因此三个线程可以同时访问内存中的txt,完成自己的工作。
如果是三个进程,文本编辑就无法工作了,理由是每个进程有自己的内存空间,内存中有三份txt副本。这意味着操作进程执行时,需要同时修改另外两个进程的内存,这就需要额外访问操作系统。这并不是单纯的效率问题,相信有工作经验的小伙伴都知道,工作环节越多,工作时间就越无法估计,因为每个环节都有可能出问题。多了系统调用这一环,编程时考虑的事情就越多。线程就可以有效避免这个问题。
总结:多建线程来代替多建进程,屏蔽了系统调用,减少编程烦恼。

标签:为什么,文本编辑,请求,线程,内存,进程,txt
From: https://www.cnblogs.com/badPineapple/p/18012407

相关文章

  • C++多线程 第四章 同步并发操作
    第四章同步并发操作等待事件设想一个情景:你正坐在一辆从哈尔滨驶向郴州的绿皮火车上,这趟车需要耗时2天2夜,合计3000公里的路程.于是在这里,我们将你和司机视作为两个线程.你的任务是在目的地下车,司机的任务是将车开到目的地.假设你和司机坐在同一个车厢内,并且你是个不说......
  • 为什么kube-controller-manager启动后https长连接数量是2
    k8sv1.19.0单节点集群2条长连接编译二进制并调试cdcmd/kube-controller-manager&&gobuild#vscodelaunch.json{"name":"Launch","type":"go","request":"launch","mode":......
  • 【多线程例题】使用三个线程,分别可以打印A,B,C。要求实现三个线程协同打印,顺序打印出ABC
    顺序打印-进阶版方法一:三个线程竞争同一个锁,通过count判断是否打印三个线程分别打印A,B,C方法一:通过count计数打印(三个线程上同样的锁,打印一个,召唤所有锁,如果不满足条件,则wait等待,锁自动解锁)方法二:/***有三个线程,分别只能打印A,B和C*要求按顺序打印ABC,打印10次*输出示......
  • 解锁阿里巴巴面试题:创建线程的几种方式?
    大家好,我是小米!今天我们来聊一个热门话题——阿里巴巴面试题:创建线程的几种方式。在技术的海洋中,线程是我们编程航程中的一艘不可或缺的船,驶向程序的未知领域。那么,究竟有哪些方式可以创建线程呢?让我们一起揭开这个技术的神秘面纱!实现Runnable接口首先,我们来说说最常见、最推荐的方......
  • FolkMQ "单线程"消息中间件 v1.0.32 发布
    简介采用“单线程”+“多路复用”+"内存运行"+"快照持久化"+"Broker集群模式"(可选)基于Socket.D网络应用协议开发。全新设计,自主架构!角色功能生产端发布消息(Qos0、Qos1)、定时消息(Qos0、Qos1)、可过期消息(Qos0、Qos1)消费端订阅、取消订阅消费......
  • Java新建一个子线程异步运行方法
    如何在运行主方法的同时异步运行另一个方法,我是用来更新缓存;1.工具类publicclassThreadPoolUtils{privatestaticfinalLoggerLOGGER=LoggerFactory.getLogger(ThreadPoolUtils.class);privatestaticfinalStringPOOL_NAME="thread-im-runner";//......
  • lazarus 3.0/fpc3.3.1写线程要注意的事项
    近日和高勇交流中发现,以下代码在delphi能编译及正确执行。procedureTForm1.Button2Click(Sender:TObject);vari:integer;beginTThread.CreateAnonymousThread(procedurebeginsleep(3000);TThread.Synchronize(TThread.CurrentThread,proced......
  • 为什么kube-scheduler启动后https长连接数量是2
    k8sv1.19.0编译二进制并调试cdcmd/kube-scheduler&&gobuild#vscodelaunch.json{"name":"Launch","type":"go","request":"launch","mode":"exec",......
  • Qt processEvents - 解决线程中事件阻塞(如槽函数被阻塞)
    百度了一会,发现没太有文字讲这件事情,因此整理成文字记录一下。processEvents介绍长时间运行的操作可以调用processEvents()保持应用程序响应能力。voidQCoreApplication::processEvents(QEventLoop::ProcessEventsFlagsflags=QEventLoop::AllEvents)根据指定的条件为调......
  • java 关于有序获取多线程的返回结果问题,按提交任务的顺序,收集执行结果
    问题:以前做的多线程,执行的返回结果都是无序的,所以每次执行完毕后还要对结果集重新进行排序,增加了耗时; 今天突然想到一个思路,在给线程池提交任务的时候,可以提前获取任务总数,创建一个用于接收结果集的固定大小list2,然后子线程执行的时候把当前任务序号传进去,处理好数据后根据序号......