线程个人觉得比进程更有必要好好钻研一把,天天配置CPU Affinity,天天给每个线程绑定对应的Core ID,却没有从根本上弄明白机理,是一件十分尴尬的事情,无脑的东西不是应该崇尚的,APUE上关于线程概念写的十分漂亮,就直接COPY过来,然后加一些自己的理解,理论还是要透彻点
典型的UNIX进程可以看成是只有一个控制线程:一个进程在同一时刻只做一件事情;但有了多个控制线程以后,可以把进程设计成同一时刻能够做不止一件事情,每个线程都能处理各自独立的任务;这种方式有很多好处:
(1)通过为每种事件类型的处理分配单独的线程,能够简化处理异步时间的代码;每个线程在进行事件处理时可以采用同步编程模式,同步编程模式要比异步编程模式简单得多
记得以前有关同步和异步都看得很纠结,这里的简单意思就是相互独立的异步事件,可以在不同的独立的线程上来处理各自的同步事件,显得十分清晰,易于处理和维护
(2)多个进程必须使用操作系统提供的复杂机制才能实现内存和文件描述符的共享,而多个线程自动地可以访问相同的存储地址空间和文件描述符
(3)有些问题可以通过将其分解从而改善整个程序的吞吐量;在只有一个控制线程的情况下,单个进程需要完成多个任务时,实际上需要把这些任务串行化;有了多个控制线程,相互独立的任务的处理可以交叉进行,只需要为每个任务分配一个单独的线程,当然只有在处理过程互不依赖的情况下,两个任务才可以穿插进行
说实话,这里我想起了几个while(1)
(4)交互的程序同样可以通过使用多线程实现响应时间的改善,多线程可以把程序中处理用户输入输出的部分与其他部分分开
有些人把多线程的程序设计与多处理器系统联系起来,但是即使程序运行在单处理器上,也能得到多线程编程模型的好处;处理器的数量并不影响程序结构,所以不管处理器的个数是多少,程序可以通过使用线程得以简化,而且即使多线程程序在串行化任务时不得不阻塞,由于某些线程在阻塞的时候还有另外一些线程可以运行,所以多线程程序在单处理器上运行仍然能够改善响应时间和吞吐量
线程包含了表示进程内执行环境必需的信息,其中包括进程中标识线程的线程ID,一组寄存器值,栈,调度优先级和策略,信号屏蔽字,errno变量以及线程私有数据;进程的所有信息对该进程的所有线程都是共享的,包括可执行的程序文本,程序的全局内存和堆内存,栈以及文件描述符