线程间的通信机制

来源:互联网 发布:云南卫生网络直报系统 编辑:程序博客网 时间:2024/06/05 16:36

线程间的通信的主要目的是用于线程同步。
可以分为:
- 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操作来操作缓冲区资源。

原创粉丝点击