竞态条件


一.        多进程间通信的角度

是指两个或多个进程对共享的数据进行读或写的操作时,最终的结果取决于这些进程的执行顺序。致竞态条件发生的代码区称作临界区

 

发生情形

①不同线程相同对象

增加一个线程,threadcount++

减少一个线程,threadcount--

threadcount为0的时候程序结束

thread1执行threadcount++,同时thread2执行threadcount--

 

thread1读取资源(内存区(变量,数组,或对象)、系统(数据库,web services等)或文件)

thread2更改或者创建相同资源

 

互斥(锁定):每个线程变动threadcount的时候锁定互斥量cout_mutex

 

有一个bug是,在第一个线程结束的时候,第二个线程一定要启动,否则,threadcount为减少为0,程序终止。

 

 

②相同对象不同进程

死锁:当两个(或以上)线程相互等待别的线程时就会出现死锁。

thread1执行顺序:锁定并调用方法1,再锁定并调用方法2···

thread2执行顺序:锁定并调用方法2,再锁定并调用方法1···

thread1和thread2都在等待对方解锁,发生死锁。

 

解决:thread1启用的时候同时锁定方法1和方法2.

 

③多线程优先级

thread2和thread3同时等待thread1解锁方法1

 

④rand()函数

两个线程同时调用rand(),会返回一个错误的随机数

 


 

 

二.       Acess中的存取检查和打开文件操作

存取检查中使 用access(2)然后使用open(2) 是很明显的非原子操作。用户可以在两次调用中移走文件。

 

解决办法

有特 权的程序应该使用seteuid()然后直接调用 open()。沿着同一思路,一个程序应该总是在 open()之前设置正确的掩码来排除不合逻辑的 chmod()调用。

 

 

三.       设备或系统出现不恰当的执行时序

读写大量数据的指令的时候竞态条件可能发生,机器试图覆盖相同的或者旧的数据,而此时旧的数据仍然在被读取。两个用户同时试图访问同一个可用信道的时候发生,在系统同意访问之前没有计算机能得到信道被占用的提示,

 

解决办法

添加一个优先级列表

 

 

四.       逻辑门

数冲突的时候,逻辑门偶尔发生竞态条件。由于门的输出状态是有限的,相应输入变化的时间是非零值,因此会导致一些不合适的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值