【进程&线程】临界区解决方法

你们都要用的变量叫 临界区域 (region)。
有几种手段能够避免ab线程一块儿进入临界区域:
1. 屏蔽中断
2. 锁变量
3. 严格轮换法
(前三个都有可能由于不是原子性操做而翻车)
 
  
  1. #define N 2 //进程数为2
  2. int turn; //如今轮到哪一个进程?
  3. int interested[N]; //初始化置为false,即没有在临界区等待读写共享数据的
  4. void enter_region(int process) //进入临界区
  5. {
  6. turn = process;
  7. int other = 1 - turn; //另外一个进程
  8. interested[turn] = true;
  9. while(turn == process && interested[other] == true)
  10. ; //一直循环,直到other进程退出临界区
  11. }
  12. void leave_region(int process)
  13. {
  14. interested[process] = false;
  15. }

进程通讯时无非会产生下列的两种状况:spa

一、进程0通讯,进程1不影响。(反之亦然).net

enter_region()中各参数的值:线程

turn = 0;rest

other = 1;code

interested[0] = true;blog

interested[1] = false;进程

while循环直接在interested[other]那一步就退出了,进程0成功进入临界区。ci

一直循环是为了阻塞线程...可是有忙等待的缺点,浪费cpu。只是保证本身对临界区感兴趣,若是本身感兴趣而且另外一个也感兴趣的话就只能空转cpu,消极等待。