Skip to content

Commit e178c80

Browse files
authored
lec12-p3
1 parent fc616c3 commit e178c80

File tree

1 file changed

+20
-9
lines changed

1 file changed

+20
-9
lines changed

lec12/p3-monitor-cond.md

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ https://yangzhaoyunfei.github.io/monitors/ 管程(Monitors) -->
107107

108108
#### 条件变量
109109
* 条件变量是多线程编程中的一种**同步机制**,用于线程间通信和协调
110-
* 它是一个结构体,包含了一个等待队列和一些基本操作函数
110+
* 它是一个结构体,包含了一个等待队列、等待和唤醒等操作函数
111111
* 通过条件变量实现线程的阻塞、唤醒和通讯等功能
112112
* 条件变量与互斥锁(mutex)配合,可实现线程间的同步和互斥
113113
* 共享资源被占用时,线程可通过条件变量挂起自己
@@ -160,20 +160,28 @@ https://yangzhaoyunfei.github.io/monitors/ 管程(Monitors) -->
160160

161161
#### 管程操作
162162

163+
<font size=5>
164+
163165
- T.enter过程:线程T在进入管程之前要获得互斥访问权(lock)
164166
- T.leave过程:当线程T离开管程时,如果紧急队列**不为空**,唤醒紧急队列中的线程,并将T所持锁赋予唤醒的线程;如果**紧急队列为空**,释放lock,唤醒入口等待队列某个线程
165-
- T.wait(c):1)阻塞线程T自己,将T自己挂到条件变量c的等待队列;
166-
- 2)释放所持锁; 3)唤醒入口等待队列的一个或者多个线程;
167+
- T.wait(c):
168+
- 1)阻塞线程T自己,将T自己挂到条件变量c的等待队列;
169+
- 2)释放所持锁;
170+
- 3)唤醒入口等待队列的一个或者多个线程;
167171
<!--释放管程权力,进入c的条件等待队列;唤醒紧急等待队列的第一个线程// 为进入管程的进程分配某种类型的资源,如果此时这种资源可用,那么进程使用,否则进程被阻塞,进入条件等待队列-->
168-
- T.signal(c):1)把条件变量c的等待队列某个线程唤醒;
172+
- T.signal(c):
173+
- 1)把条件变量c的等待队列某个线程唤醒;
169174
- 2)把线程T所持lock给被唤醒的线程;
170175
- 3)把线程T自己挂在紧急等待队列
171176
<!--唤醒由于等待这种资源而进入条件等待队列的(c的条件等待队列)第一个线程进入管程的进程某种资源释放,此时进程会唤醒由于等待这种资源而进入条件等待队列的第一个进程-->
172177

178+
</font>
179+
173180
<!--
174181
---
175182
176183
#### 管程 -- 条件变量
184+
177185
- 同步:条件变量(Condition Variables)以及相关的两个操作:wait和signal,处理等待机制。
178186
- Wait()操作
179187
- 将自己阻塞在等待队列中
@@ -202,25 +210,28 @@ https://yangzhaoyunfei.github.io/monitors/ 管程(Monitors) -->
202210
3. 条件变量的实现
203211
4. 生产者-消费者问题的管程实现
204212

205-
---
213+
---
206214

207215
#### 管程实现方式
208-
<!-- https://blog.csdn.net/qq_34666857/article/details/103189107 Java并发编程模拟管程(霍尔Hoare管程、汉森Hansan管程、MESA管程) -->
216+
217+
<!--
218+
https://blog.csdn.net/qq_34666857/article/details/103189107 Java并发编程模拟管程(霍尔Hoare管程、汉森Hansan管程、MESA管程)
219+
-->
209220

210221
如果线程T1因条件A未满足处于阻塞状态,那么当**线程T2让条件A满足并执行signal操作唤醒T1**后,不允许线程T1和T2同时处于管程中,那么如何确定哪个执行/哪个等待?
211222
- 管程中条件变量的释放处理方式:
212223
- Hoare管程:**T1执行**/T2等待,直至T1离开管程,然后T2继续执行
213224
- MESA/Hansen管程:**T2执行**/T1等待,直至T2离开管程,然后T1可能继续执行(重新竞争/直接执行)
214225

215-
---
226+
---
216227

217228
#### 管程中条件变量的释放处理方式
218229

219230
<!-- https://blog.csdn.net/qq_34666857/article/details/103189107 Java并发编程模拟管程(霍尔Hoare管程、汉森Hansan管程、MESA管程) -->
220231
- 线程 T2 的signal,使线程 T1 等待的条件满足时
221232
- Hoare:T2 通知完 T1后,T2 阻塞,T1 马上执行;等 T1 执行完,再唤醒 T2 执行
222-
- Hansen: T2 通知完 T1 后,T2 还会接着执行,T2 执行结束后(规定:最后操作是signal),然后 T1 再执行(将锁直接给T1)
223-
- MESA:T2 通知完 T1 后,T2 还会接着执行,T1 并不会立即执行,而是重新竞争访问权限
233+
- Hansen: T2 通知完 T1 后,T2 还会接着执行,T2 执行结束后(规定:最后操作是signal),然后 **T1 再执行**(将锁直接给T1)
234+
- MESA:T2 通知完 T1 后,T2 还会接着执行,T1 并不会立即执行,而是**重新竞争**访问权限
224235

225236
---
226237

0 commit comments

Comments
 (0)