@@ -419,7 +419,24 @@ exit section
419
419
420
420
---
421
421
422
- ##### 尝试一
422
+ ##### 尝试一 根据turn值进入临界区
423
+ ![ bg right:50% 100%] ( figs/soft-1.png )
424
+ - 满足“忙则等待”,但是有时不满足“空闲则入”
425
+ ``` c
426
+ // 线程 Tj
427
+ do {
428
+ while (turn != j) ;
429
+ critical section
430
+ turn = i;
431
+ remainder section
432
+ } while (1 )
433
+ ```
434
+
435
+
436
+
437
+ ---
438
+
439
+ ##### 尝试一 根据turn值进入临界区
423
440
![ bg right:50% 100%] ( figs/soft-1.png )
424
441
- 满足“忙则等待”,但是有时不满足“空闲则入”
425
442
- Ti不在临界区,Tj想要继续运行,但是必须等待Ti进入过临界区后
@@ -430,7 +447,7 @@ exit section
430
447
431
448
---
432
449
433
- ##### 尝试二
450
+ ##### 尝试二 根据flag进入临界区
434
451
![ bg right:50% 100%] ( figs/soft-2.png )
435
452
- 互相依赖(线程忙等)
436
453
- 不满足“忙则等待”
449
466
450
467
---
451
468
452
- ##### 尝试三
469
+ ##### 尝试三 根据flag进入临界区
453
470
![ bg right:50% 100%] ( figs/soft-3.png )
454
471
- 满足“忙则等待”,但是不满足“空闲则入”
455
472
- flag[ i] =flag[ j] =1
@@ -466,15 +483,15 @@ do {
466
483
467
484
---
468
485
469
- ##### Peterson算法
486
+ ##### Peterson算法 turn+flag
470
487
471
488
![ bg right:50% 100%] ( figs/soft-peterson.png )
472
489
- 满足线程Ti和Tj之间互斥的经典的基于软件的解决方法(1981年)
473
490
- 孔融让梨
474
491
475
492
---
476
493
477
- ##### Peterson算法
494
+ ##### Peterson算法 turn+flag
478
495
```
479
496
// 共享变量
480
497
let mut flag = [false; N]; // 标识进程是否请求进入临界区
@@ -501,7 +518,7 @@ while (true) {
501
518
502
519
---
503
520
504
- ##### Peterson算法
521
+ ##### Peterson算法 turn+flag
505
522
![ bg right:50% 100%] ( figs/soft-peterson-2.png )
506
523
```
507
524
//进程Pi
@@ -565,7 +582,7 @@ Eisenberg和McGuire
565
582
566
583
---
567
584
568
- ##### N线程
585
+ ##### N线程 - 初始化
569
586
``` c
570
587
INITIALIZATION:
571
588
@@ -578,7 +595,7 @@ for (index=0; index<n; index++) {
578
595
579
596
---
580
597
581
- ##### N线程
598
+ ##### N线程 - 进入临界区
582
599
``` c
583
600
ENTRY PROTOCOL (for Process i ):
584
601
repeat {//从turn到i是否存在请求进程:若存在,则不断循环,直至不存在这样的进程,将当前进程标记为ACTIVE
@@ -600,7 +617,7 @@ turn = i;//获得turn并处理
600
617
601
618
---
602
619
603
- ##### N线程
620
+ ##### N线程 - 离开临界区
604
621
```c
605
622
EXIT PROTOCOL (for Process i ):
606
623
0 commit comments