- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验二线程与同步-Read.PDF
实验二 线程与同步
小组成员与分工
姓名 学号 分工
崔 桃 查阅文档,编写部分代码
黄长泽 报告文档编写,编写部分代码
蒋益元 主要代码编写
一.实验内容
本次实验的目的在于将 nachos 中的锁机制和条件变量的实现补充完整,并利用这些同
步机制实现几个基础工具类。
实验内容分三部分:
1. 实现锁机制和条件变量,并利用这些同步机制将实验一中所实现双向有序链表类
修改成线程安全的;
2. 实现一个线程安全的表结构;
3. 实现一个大小受限的缓冲区(详细内容请看 nachos-labs.pdf )。
二.实现方案
1. 问题分析
1.1 锁机制和条件变量的实现
这部分实现主要参考 Semaphore 中 Semaphore::P()和 Semaphore::V()的实现。
第一部分要求使用 Thread::Sleep 实现锁机制和条件变量;第二部分要求使用 Semaphore
实现锁机制和条件变量;
(1)使用 Thread::Sleep 实现锁机制和条件变量:主要用 Thread::Sleep 来实现阻塞,
Lock::Acquire()参考 Semaphore 中 Semaphore::P(),关中断,判断当前锁是否可用(在锁类
中加一状态变量 enum LockStatus { Free, Busy },如果当前状态为 Free 则可用,为 Busy
则不可用)可用继续执行,并改变锁状态,不可用则调用 Thread::Sleep 将当前线程阻塞。
Lock::Release()参考 Semaphore 中 Semaphore::V(),由于只有拥有锁的线程才能释放锁,所
以先要调用 isHeldByCurrentThread()进行判断,为当前线程拥有则继续执行,关中断,从
阻塞对列中选取一线程加到就绪队列中。
Condition::Wait(Lock* conditionLock) 参考有关于条件变量的说明,(注意,实验要求采
用 Mesa 语义,而非 Hoare 语义。)条件变量与锁结合使用,先获得锁,再对条件变量进行
判断,符合则继续执行,否则调用 Wait();(在 Wait()中要实现的是释放锁,将当前线
程调用 Thread::Sleep 阻塞。当条件改变,若该线程被激活则再次请求获得锁)继续进行条
件判断,直到条件满足,进入临界区,执行完临界区代码后在释放锁。
Condition::Signal(Lock* conditionLock) 参考有关于条件变量的说明,当条件变量改变后,
调用 Signal(),用来释放阻塞在条件变量的线程序,(在 Signal()要实现饿主要是从阻
塞对列中释放一线程,将其加到锁的阻塞队列上。
Condition::Broadcast(Lock* conditionLock)与 Condition::Signal(Lock* conditionLock)
的实现相似,不同在于 Signal()只释放一个阻塞线程,而 Broadcast()释放所有阻塞在
条件变量的线程。
(2 )用 Semaphore 实现锁机制和条件变量:
Lock::Acquire()用 Semaphore 来实现锁,由于锁类似于二元信号量,所以在锁类中定义一
初始值为 2 的 Semaphore,在Acquire()中要实现的是调用 Semaphore::P()再改变锁的状态。
Lock::Release()要实现的是先要调用 isHeldByCurrentThread()进行判断,为当前线程拥有
则继续执行,再调用 Semaphore::V()再改变锁的状态。
Condition::Wait(Lock* conditionLock) 参考有关于条件变量的说明,(注意,实验要求采
用 Mesa 语义,而非 Hoare 语义。)条件变量与锁结合使用,先获得锁,再对条件变量进行
文档评论(0)