没有合适的资源?快使用搜索试试~ 我知道了~
线程同步
资源推荐
资源详情
资源评论
线程同步
一、线程同步基础
多线程并发服务器有很多优点,但存在一些问题,要注意。除了之前说的线程安全性问
题,另一个重要的方面是线程同步。线程在处理共享数据和进程资源是必须使用同步机制。
例如两个线程同时修改一个结构,其定义如下:
struct info
{
int id;
char name[10];
};
由于两个线程(a 和 b)同时运行,就有可能线程 a 修改了变量 id 后,线程 b 开始运行
并修改了变量 id 和 name,然后线程 a 又修改了变量 name。此时,info 中的 id 变量值是线
程 b 的,而 name 是线程 a 的,从而造成 id 和 name 的不一致,这就是两个进程不同步造成
的。
二、互斥锁基础
1、 互斥锁的概念
在 unix 系统中,提供一种基本的线程同步机制——互斥锁。它是一种锁,用来保护线
程代码中共享数据结构的完整性。互斥锁具有 3 个特点:
对互斥锁的操作(加锁/减锁)是原子操作,这就意味着操作系统将保证同时只有
一个线程能成功完成对一个互斥锁的加锁操作。
如果一个线程已经对某一互斥锁进行了加锁,其他线程只有等待该线程完成对这一
互斥锁解锁后,才能完成加锁操作。
如果一个线程已经对某一加锁的互斥锁进行了加锁操作,该线程将被挂起。只有当
该互斥锁被解锁后,该线程才被唤醒并完成加锁操作。
利用互斥锁可以保证在某一时间内,只有一个线程能执行“关键”代码。通常,这些
“关键”代码是用于修改共享数据的,从而保证其数据的完整性。具体的实现方法是:在
“关键”代码前加锁某一互斥锁,在“关键”代码结束时解锁该互斥锁。对于上一节的例子,
可以用以下伪代码实现数据的完整性。
加锁互斥锁 X1;
修改变量 id;
修改变量 name;
解锁互斥锁 X1。
线程 a 首先运行,当修改了变量 id 后,线程 b 运行这个流程,而此时线程 a 已锁定了
同一互斥锁 X1,线程 b 被挂起来直至线程 a 完成所有修改工作并解锁该互斥锁,最后运行
结果 id 和 name 都是由线程 b 修改的,从而保证了数据的完整性。
在互斥锁的应用中,只有使用同一互斥锁才能实现“互斥”。在上面的例子中,如果存
在线程 c,它采用同样“关键”代码来修改 info 中的变量 id 和 name,但采用了不同的互斥
锁 X2,此时 info 的数据完整性仍无法保证。
如果设置了过多的互斥锁,代码就没有什么并发性可言,即使“关键”代码只有一条语
句,因为一条语句可能会被编译成多条机器指令,也就有可能在完成该语句前插入其他线程
资源评论
key_next
- 粉丝: 30
- 资源: 34
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功