互斥锁、同步锁、读写锁的区别
来源:互联网 发布:自学python看什么书 编辑:程序博客网 时间:2024/06/05 16:51
相交进程之间的关系主要有两种,同步与互斥。所谓互斥,是指散步在不同进程之间的若干程序片断,当某个进程运行其中一个程序片段时,其它进程就不能运行它 们之中的任一程序片段,只能等到该进程运行完这个程序片段后才可以运行。所谓同步,是指散步在不同进程之间的若干程序片断,它们的运行必须严格按照规定的 某种先后次序来运行,这种先后次序依赖于要完成的特定的任务。 显然,同步是一种更为复杂的互斥,而互斥是一种特殊的同步。 也就是说互斥是两个线程之间不可以同时运行,他们会相互排斥,必须等待一个线程运行完毕,另一个才能运行,而同步也是不能同时运行,但他是必须要安照某种次序来运行相应的线程(也是一种互斥)! 总结:互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。 同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。
读写锁特点:
1)多个读者可以同时进行读2)写者必须互斥(只允许一个写者写,也不能读者写者同时进行)3)写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者)
互斥锁特点:
一次只能一个线程拥有互斥锁,其他线程只有等待
互斥锁(lock)
lock 关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁。当任何一个线程获取到锁后,其他线程如果需要使用该临界区内代码,则必须等待前一个线程使用完毕后释放锁。
代码示例:
12345Object thisLock =
new
Object();
lock (thisLock)
{
// 临界区代码块
}
读写锁(ReadWriteLock)ReadWriteLock定义支持单个写线程和多个读线程的锁。该锁的作用主要是解决并发读的性能问题,使用该锁,可以大大提高数据并发访问的性能,只有在写时,才会阻塞所有的读锁。
示例代码:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768using System.Collections.Generic;
using System.Windows;
using System.Threading;
namespace FYSTest
{
public
partial
class
MainWindow : Window
{
List<
int
> list =
new
List<
int
>();
private
ReaderWriterLock _rwlock =
new
ReaderWriterLock();
public
MainWindow()
{
InitializeComponent();
Thread ThRead =
new
Thread(
new
ThreadStart(Read));
ThRead.IsBackground =
true
;
Thread ThRead2 =
new
Thread(
new
ThreadStart(Read));
ThRead2.IsBackground =
true
;
Thread ThWrite =
new
Thread(
new
ThreadStart(Write));
ThWrite.IsBackground =
true
;
ThRead.Start();
ThRead2.Start();
ThWrite.Start();
}
private
void
Read()
{
while
(
true
)
{
//使用一个 System.Int32 超时值获取读线程锁。
_rwlock.AcquireReaderLock(
100
);
try
{
if
(list.Count >
0
)
{
int
result = list[list.Count -
1
];
}
}
finally
{
//减少锁计数,释放锁
_rwlock.ReleaseReaderLock();
}
}
}
int
WriteCount =
0
;
//写次数
private
void
Write()
{
while
(
true
)
{
//使用一个 System.Int32 超时值获取写线程锁。
_rwlock.AcquireWriterLock(
100
);
try
{
list.Add(WriteCount++);
}
finally
{
//减少写线程锁上的锁计数,释放写锁
_rwlock.ReleaseWriterLock();
}
}
}
}
}
阅读全文
0 0
- 互斥锁、同步锁、读写锁的区别
- 同步 互斥锁 读写锁 区别
- 线程同步互斥锁和读写锁的区别
- 线程同步的方式-互斥锁/读写锁
- POS线程同步互斥锁和读写锁的区别和各自适用场景
- 线程同步互斥锁和读写锁的区别和各自适用场景
- 同步(三)读写锁
- 同步与读写锁
- 线程同步-读写锁
- 互斥锁 自旋锁 读写锁的区别
- 互斥锁和读写锁的区别
- 互斥锁和读写锁的区别
- 读写锁和互斥锁的区别
- 锁,同步,可重入锁,读写锁
- 锁,同步,可重入锁,读写锁
- 锁,同步,可重入锁,读写锁
- 各种同步锁的区别
- 同步——读写锁
- 在 Markdown 实现段首缩进
- logrotate切割nginx日志
- warning MSB8004: Output Directory does not end with a trailing slash.
- u-boot移植(五)使支持DM9000
- Codeforces 821B Okabe and Banana Trees 题解
- 互斥锁、同步锁、读写锁的区别
- crond和crontab 调研
- 信息论(2-4章)笔记
- View Animation——视图动画
- YOLO源码详解(三)- 前向传播(forward)
- c++中return this和return *this的区别
- 润乾v5填报-分片问题分析
- Docker 的集群使用
- 滚动字幕