同步器
Linux 并发与通信
并发控制中主要考虑线程之间的通信
在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写
进程/ 线程间的通信
操作系统的主要任务是管理计算机的软件、硬件资源。现代操作系统的主要特点是多用户和多任务,也就是程序的并行执行。所以操作系统就借助于进程来管理计算机的软、硬件资源,支持多任务的并行执行。要并行执行就需要多进程、多线程。因此多进程和多线程间为了完成一定的任务,就需要进行一定的通信。而线程间通信又和进程间的通信不同。由于进程的数据空间相对独立而线程是共享数据空间的,彼此通信机制也很不同。
fork()
系统调用创建的,进程间都有独立的地址空间,他们之间不能直接通信,必须通过一些clone()
系统调用创建的

因为同一进程的不同线程共享同一份全局内存区域,其中包括初始化数据段、未初始化数据段,以及堆内存段,所以线程之间可以方便、快速地共享信息。只需要将数据复制到共享(全局或堆)变量中即可。不过,要避免出现多个线程试图同时修改同一份信息。线程中常用的通信机制包括了锁、信号量与信号:
-
锁:包括互斥锁、条件变量、读写锁;互斥锁提供了以排他方式防止数据结构被并发修改的方法。使用条件变量可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的,条件变量始终与互斥锁一起使用。读写锁允许多个线程同时读共享数据,而对写操作是互斥的。
-
无名信号量(Semaphore
) :无名信号量只用于线程间的同步,有名信号量只用于进程间通信。信号量是属于POSIX:SEM 的,不是属于POSIX:THR 的,需要的文件头是。两者的共同点都是相当于计数器,用于限制多个进程对有限共享资源的访问。 -
信号(Signal
) :线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。