线程间的通信机制
2017-10-03 11:24
155 查看
线程间的通信的主要目的是用于线程同步。
可以分为:
- 1.锁机制 :
互斥锁
自旋锁
读写锁
条件变量
- 2.信号量
- 3.信号
//=====================================================
互斥锁:
是一种信号量,常用来防止两个进程或者线程之间同时访问同一共享资源,使用互斥锁可以保证:原子性、唯一性和非繁忙等待。
自旋锁:
自旋锁和互斥锁功能类似,不同的是,自旋锁不会引起调用进程阻塞,若自旋锁已经被别的执行单元保持,调用进程就会一直循环来查询是否该自旋锁的保持者已经释放了该锁。
自旋锁有以下缺点:
1. CPU一直运行,当被获得自旋锁时,进程会一直循环在那里,这意味着如果不能在很短的时间内获得自旋锁,CPU的效率无疑会降低。
2. 自旋锁可能会引起死锁。所以,现代处理器自旋锁在单核非抢占式CPU上是无效的,被设为空操作,不做任何事。
读写锁:
1.读写锁把对资源的访问分为读者和写者。
2.多个读者可以同时并且只能对共享资源进行读访问,写者必须独占共享资源进项写操作。
3.读写锁处于写锁状态时,所有试图对读写锁加锁的进程(不管是读还是写),都将被阻塞。
4.读写锁处于读锁状态时,有写锁试图加锁时,之后到来的读锁请求都将被阻塞,以避免长时间的写者得不到写锁。
条件变量:
1.条件变量是利用线程共享全局变量进行同步的一种机制,主要包括两个动作:线程A等待 “条件变量的条件成立”而挂起。另一个线程使“条件成立(给出条件成立信号)”而唤醒线程A的运行。
2.在pthead库中通过条件变量condition variable来阻塞等待一个条件,或者唤醒等待这个条件的线程。一个condition variable总是和一个互斥量mutux搭配使用。线程A可以调用pthead_cond_wait在一个condition variable上阻塞等待。
3.线程调用pthead_cond_wait这个函数后,内核会做下面的事情。
1. 拿到锁的线程,把锁暂时释放。
2. 当前线程休眠,进行等待。
3. 线程等待通知,要醒来(重新获得锁)。
4. 典型的应用是消费者-生产者模式。
信号量:
适用于共享资源有多个的情况下,比如消费者-生产者。各自的缓冲区不受影响。只要缓冲区有产品,消费者就可以进行消费;只要缓冲区有空余的,生产者就可以生产。如果使用互斥锁机制,同一时刻只能有一方消费或者生产,这是不科学的。消费者和生产者都是用PV操作来操作缓冲区资源
4000
。
可以分为:
- 1.锁机制 :
互斥锁
自旋锁
读写锁
条件变量
- 2.信号量
- 3.信号
//=====================================================
互斥锁:
是一种信号量,常用来防止两个进程或者线程之间同时访问同一共享资源,使用互斥锁可以保证:原子性、唯一性和非繁忙等待。
自旋锁:
自旋锁和互斥锁功能类似,不同的是,自旋锁不会引起调用进程阻塞,若自旋锁已经被别的执行单元保持,调用进程就会一直循环来查询是否该自旋锁的保持者已经释放了该锁。
自旋锁有以下缺点:
1. CPU一直运行,当被获得自旋锁时,进程会一直循环在那里,这意味着如果不能在很短的时间内获得自旋锁,CPU的效率无疑会降低。
2. 自旋锁可能会引起死锁。所以,现代处理器自旋锁在单核非抢占式CPU上是无效的,被设为空操作,不做任何事。
读写锁:
1.读写锁把对资源的访问分为读者和写者。
2.多个读者可以同时并且只能对共享资源进行读访问,写者必须独占共享资源进项写操作。
3.读写锁处于写锁状态时,所有试图对读写锁加锁的进程(不管是读还是写),都将被阻塞。
4.读写锁处于读锁状态时,有写锁试图加锁时,之后到来的读锁请求都将被阻塞,以避免长时间的写者得不到写锁。
条件变量:
1.条件变量是利用线程共享全局变量进行同步的一种机制,主要包括两个动作:线程A等待 “条件变量的条件成立”而挂起。另一个线程使“条件成立(给出条件成立信号)”而唤醒线程A的运行。
2.在pthead库中通过条件变量condition variable来阻塞等待一个条件,或者唤醒等待这个条件的线程。一个condition variable总是和一个互斥量mutux搭配使用。线程A可以调用pthead_cond_wait在一个condition variable上阻塞等待。
3.线程调用pthead_cond_wait这个函数后,内核会做下面的事情。
1. 拿到锁的线程,把锁暂时释放。
2. 当前线程休眠,进行等待。
3. 线程等待通知,要醒来(重新获得锁)。
4. 典型的应用是消费者-生产者模式。
信号量:
适用于共享资源有多个的情况下,比如消费者-生产者。各自的缓冲区不受影响。只要缓冲区有产品,消费者就可以进行消费;只要缓冲区有空余的,生产者就可以生产。如果使用互斥锁机制,同一时刻只能有一方消费或者生产,这是不科学的。消费者和生产者都是用PV操作来操作缓冲区资源
4000
。
相关文章推荐
- Java线程之间的通信-等待/通知机制
- Android线程间通信机制(Handler Looper )
- java线程之间的通信(等待/通知机制)
- 不使用等待通知机制 实现线程间通信的 疑问分析
- Android线程间异步通信机制源码分析
- Android的消息机制,用Android线程间通信的Message机制,Android中Handler的使用方法——在子线程中更新界面,handler机制
- 一张图让你彻底搞清Android线程间通信机制
- 进程间通信机制(管道、信号、共享内存/信号量/消息队列)、线程间通信机制(互斥锁、条件变量、posix匿名信号量)
- Java多线程基础篇(04)-线程同步机制和线程间通信
- Net线程间通信的异步机制
- java基础12:线程间通信----等待唤醒机制
- Android的消息机制,用Android线程间通信的Message机制,Android中Handler的使用方法——在子线程中更新界面,handler机制
- 多线程中的线程间通信及等待/通知机制的两种实现方式
- 什么是.Net的异步机制(线程间通信) - step 5
- Android笔记(三十) Android中线程之间的通信(二)Handler消息传递机制
- Android消息机制 & Android线程间通信机制
- linux基础——linux线程间通信及同步机制总结
- java多线程——线程间通信之线程等待唤醒机制
- Windows线程间通信机制
- 线程2:线程通信事件机制(单线程、两个线程、多个线程通信)