I a*_*one 4 c++ algorithm concurrency operating-system
这是我们讲座中提出的彼得森解决方案:
//P0:
do {
flag[0] = TRUE; turn = 1;
while(flag[1] && turn == 1);
//Critical section
flag[0] = FALSE;
//remainder section
} while(1)
//P1:
do {
flag[1] = TRUE; turn = 0;
while(flag[0] && turn == 0);
//critical section
flag[1] = FALSE;
//remainder section
} while(1)
Run Code Online (Sandbox Code Playgroud)
转变量本身不就已经保证了临界区的要求吗?像flag[]这里似乎没有必要。
该flag数组指定每个进程当前是否对临界区感兴趣(即当前是否希望进入临界区或已经在临界区内部)。由于以下原因,此信息是必要的:
假设进程 #0 想要进入临界区,它必须知道进程 #1 当前是否也对临界区感兴趣,因为进程 #0 必须根据进程 #1 是否也对临界区感兴趣而采取不同的行动。
如果进程 #1对临界区不turn感兴趣,则进程 #0 不应等待进程 #1 设置为0,因为它可能无限期地等待这种情况发生,这将违反“进度”和“有界等待”要求。相反,在这种情况下,进程 #0 应该简单地进入临界区。
如果进程 #1对临界区感兴趣,那么进程 #0 应该等待进程 #1
flag[1]来指示false),或者turn来指示0)。否则,就会违反“互斥”要求。
| 归档时间: |
|
| 查看次数: |
265 次 |
| 最近记录: |