进/线程间同步 通讯的方法

来源:互联网 发布:威尼斯共和国 知乎 编辑:程序博客网 时间:2024/06/08 14:15

转载:http://blog.csdn.net/zqt520/article/details/8110305


Linux进程通讯的方法:

 

管道/FIFO/共享内存/消息队列/信号/

 

以上几种方式的比较:    
1.管道:速度慢,容量有限,只有父子进程能通讯。 常见的单向进程间通信机制,发送信息的为发送进程,接受信息的为接受进程。管道通信的中间介质为文件,这样的文件为管道文件   
2.FIFO:任何进程间都能通讯,但速度慢    
3.消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题 。 消息队列的中间介质是消息缓冲区,消息队列最大的缺点是需要不断的复制消息。
--------4.信号量:不能传递复杂消息,只能用来同步    
5.共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存。 该方法需要有外部通信协议、同步或者互斥机制来进行配合使用才能保证通信的有效性和正确性。
Windwos进程间同步方法:
互斥量、信号量、事件、可等计时器等几种技术
线程间同步的方法:
互斥量、信号量、事件,临界区(critical section),
临界区(critical section),保证在某一时刻只有一个线程能访问数据的简便办法。 使用临界区域的第一个忠告就是不要长时间锁住一份资源。临界区域的一个缺点就是:Critical Section不是一个核心对象,无法获知进入临界区的线程是生是死,如果进入临界区的线程挂了,没有释放临界资源,系统无法获知,而且没有办法释放该临界资源。使用临界区域的第一个忠告就是不要长时间锁住一份资源。
用事件来同步线程是最具弹性的,一个事件有激发态和非激发态。事件又分两种类型:手动重置事件和自动重置事件。一般使用自动重置事件来进行线程的同步。事件对象也可以通过通知操作的方式来保持线程的同步。并且可以实现不同进程中的线程同步操作。
互斥量和临界区很相似,但是Mutex花费的时间比Critical section大。互斥量跟临界区很相似,只有拥有互斥对象的线程才具有访问资源的权限,由于互斥对象只有一个,因此就决定了任何情况下此共享资源都不会同时被多个线程所访问。互斥量比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享
信号量允许多个线程同时使用共享资源,这与操作系统中的PV操作相同。它指出了同时访问共享资源的线程最大数目。它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。
Mutex是核心对象,系统级的, Event、Semaphore也是,可以跨进程使用。 只有Critical section是进程级的,也就是说他可能利用进程内的一些标志来保证该进程内的线程同步。
原创粉丝点击