前提:一个进程至少有一个线程,进程之间的通信就是进程里面线程之间的通信。进程通信又有个专有缩写,叫IPC(Inter-Process Communication)。
Q1:为什么要通信?
A:通信是人类的基本需求。个体的力量是有限的,只有适当的合作,才能完成更加庞大的任务。合作,就需要交流信息和共享信息,这,就是线程之间进行通信的基本诉求。
Q2:线程之间利用什么来实现通信?
A:
(1)、管道
管道可以想向成有线电话,人与人之间在使用有线电话进行通话的时候,中间的电线就相当与专属于通话双方的管道。在本书中,管道特别用与同一进程中不同线程之间的通话。
(2)、记名管道
理解可以和管道类似,只是“记名管道”用在不同进程的线程之间的通信
总结:联系一下现实生活中,在同一个市区拨打电话不需要加区号,而不同市区之间的通话则必须加拨区号,这个区号的作用就和记名管道的作用类似
(3)、套接字(Socket)
初次接触套接字,是在网络课上。因为将要学习Soxket编程了。套接字首先在BSD中出现,随后几乎渗透到所有主流的操作系统。使用套接字通信的双方必须均创建一个套接字,其中一方作为服务器,一方作为客户方。服务器方必须创建一个服务区套接字,然后在该套接字上进行监听,等待远方的连接请求。
(4)、信号
信号,就是现实生活中的电报,在计算机里,信号就是一个内核对象(内核数据结构),并利用软中断进行发送。
可以解决我们的如下需求:
- 想迫使一方对我们的通信立即作为回应。
- 我们不愿事先建立任何连接,而是临时突然觉得需要向某个进程通信
- 传输的信息量微小,建立一条专线并不划算。
(5)、信号量
类似于现实中的旗语,在计算机里就是一个简单的整数,不光是一种通信机制,还是一种同步机制。
(6)、共享内存
如果两个进程的关系特别特别好,可以理解为恋爱中的两个人,恨不得一直粘在一起,需要共享特别多的数据和信息。。。。。这时,只有拥抱,才是最好的通信。。。。。不过,共享内存的确定就是管理复杂,两个人距离太近了容易审美疲劳,所以,合适的距离才是最好的。而这个合适二字,需要根据不同的需求来决定。
(7)、消息队列
如果读者了解Windows编程的相关机制,就对消息队列一定不陌生,看着像管道?????NO,管道有固定的双方,而消息队列没有固定的通信双方。
Q3:线程之间为什么要同步?同步的目的是什么?
A:线程在带来程序的并发的优点以后,也带来了程序执行结果的不确定性,而程序执行结果的不确定性是我们所不允许的。同步的目的就是保证多线程执行下的结果的确定性,记住:同时还尽量减少对线程执行的限制。