线程之间不存在通信,因为本来就共享同一片内存
各个线程可以访问进程中的公共变量,资源,所以使用多线程的过程中需要注意的问题是如何防止两个或两个以上的线程同时访问同一个数据,以免破坏数据的完整性。数据之间的相互制约包括 1、直接制约关系,即一个线程的处理结果,为另一个线程的输入,因此线程之间直接制约着,这种关系可以称之为同步关系 2、间接制约关系,即两个线程需要访问同一资源,该资源在同一时刻只能被一个线程访问,这种关系称之为线程间对资源的互斥访问,某种意义上说互斥是一种制约关系更小的同步
-
临界区
- 每个线程中访问临界资源的代码,一个线程拿到临界区的所有权后,可以多次重入.只有前一个线程放弃,后一个才可以进来
-
互斥量
- 互斥量就是简化版的信号量
- 互斥量由于也有线程所有权的概念,故也只能进行线程间的资源互斥访问,不能由于线程同步
- 由于互斥量是内核对象,因此其可以进行进程间通信,同时还具有一个很好的特性,就是在进程间通信时完美的解决了"遗弃"问题
-
信号量
- 信号量的用法和互斥的用法很相似,不同的是它可以同一时刻允许多个线程访问同一个资源,PV操作
- 信号量也是内核对象,也可以进行进程间通信
-
管道
- 半双工
- 只能在具有父子关系的进程间使用
- FIFO的共享内存实现
-
命名管道
- 以linux中的文件的形式存在
- 不要求进程有用父子关系,甚至通过网络也是可以的
- 半双工
-
信号量
- 有up和down操作
- 共享内存实现
-
消息队列
- 队列数据结构
- 共享内存实现
-
信号
- 较为复杂的方式,用于通知进程某事件已经发生.例如kill信号
-
共享内存
- 将同一个物理内存附属到两个进程的虚拟内存中
-
socket
- 可以跨网络通信