一. 多进程间通信的角度
是指两个或多个进程对共享的数据进行读或写的操作时,最终的结果取决于这些进程的执行顺序。致竞态条件发生的代码区称作临界区
发生情形:
①不同线程相同对象
增加一个线程,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()调用。
三. 设备或系统出现不恰当的执行时序
读写大量数据的指令的时候竞态条件可能发生,机器试图覆盖相同的或者旧的数据,而此时旧的数据仍然在被读取。两个用户同时试图访问同一个可用信道的时候发生,在系统同意访问之前没有计算机能得到信道被占用的提示,
解决办法:
添加一个优先级列表
四. 逻辑门
数冲突的时候,逻辑门偶尔发生竞态条件。由于门的输出状态是有限的,相应输入变化的时间是非零值,因此会导致一些不合适的操作。