文档详情

苏州大学操作系统概念第六章.ppt

发布:2016-12-19约1.59万字共83页下载文档
文本预览下载声明
* * 每个哲学家按照以下的顺序轮流调用操作 pickup() 和putdown() dp.pickup (i) EAT dp.putdown (i) 哲学家就餐问题的管程解决方案 7、同步实例 Solaris同步 Solaris 实现了多种锁来支持多任务、多线程(包括实时线程)和多进程处理。 - 适应互斥量:保护那些为较短代码段所访问的数据 - 条件变量 - 信号量 - 读–写锁:用于保护经常访问但通常是只读访问的数据 - 十字转门:用于安排等待获取适应互斥和读写锁的线程链表 Linux: 使用禁止中断来实现短的临界区 Linux 提供: 信号量 自旋锁 Linux 同步 在单处理器系统中,使用中断屏蔽来保护全局资源的访问 在多处理器系统中使用自旋锁 也提供调度对象,这些对象类似于互斥、信号量等 调度对象也可以提供事件来同步(events) 事件的使用与条件变量类似 Windows 同步 Pthreads API 操作系统无关 提供了: 互斥锁 条件变量 不可移植的扩展包括: 读写锁 自旋锁 Pthreads同步 Windows同步机制 事件(Event) 临界区(Critical Section) 信号量(Semaphore) 事件 事件(Event)对象可通过通知操作的方式来保持同步,可实现不同进程中的线程同步操作(跨进程) 事件是WIN32中最灵活的线程间同步机制 事件存在两种状态: 激发状态(Signaled or True) 未激发状态(Unsignaled or False) 事件可分为两类: 手动设置: 这种对象只可能用程序手动设置,在需要该事件或者事件发生时,采用SetEvent及ResetEvent来进行设置。 自动恢复: 一旦事件发生并被处理后,自动恢复到没有事件状态,不需要再次设置。 事件 API 创建事件: HANDLE CreateEvent(  LPSECURITY_ATTRIBUTES lpEventAttributes,  // SECURITY_ATTRIBUTES结构指针,可为NULL  BOOL bManualReset,  // 手动/自动  // TRUE:在WaitForSingleObject后必须手动调用ResetEvent清除信号  // FALSE:在WaitForSingleObject后,系统自动清除事件信号  BOOL bInitialState, //初始状态  LPCTSTR lpName //事件的名称 ) 打开事件 HANDLE hEvent=OpenEvent(EVENT_ALL_ACCESS,true,“MyEvent”); 其它 ResetEvent() SetEvent() WaitForMultipleObjects() 事件例子 三个线程: 主线程 读线程 写线程 读线程必须在写线程操作结束后才能进行读; 主线程必须等读和写线程结束后才能结束 代码 include stdafx.h #include windows.h #include process.h #include iostream.h #include fstream.h HANDLE evRead,evFinish; void ReadThread(LPVOID param) { WaitForSingleObject(evRead, INFINITE); coutReadingendl; SetEvent(evFinish); } void WriteThread(LPVOID param) { coutWritingendl; SetEvent(evRead); } int main(int argc, char* argv[]) { evRead= CreateEvent(NULL,FALSE,FALSE,NULL); evFinish= CreateEvent(NULL,FALSE,FALSE,NULL); _beginthread(ReadThread,0,NULL); _beginthread(WriteThread,0,NULL); WaitForSingleObject(evFinish, INFINITE); coutEnd.endl; return 0; } 临界区 临界区:保证在某一时刻只有一个线程能访问数据的简便办法。在任意时刻只允许一个线程对共享资源进行访问 临界区包含两个操作原语: EnterCriticalSection() :进入临界区 Lea
显示全部
相似文档