C语言:25同步与死锁ppt课件_第1页
C语言:25同步与死锁ppt课件_第2页
C语言:25同步与死锁ppt课件_第3页
C语言:25同步与死锁ppt课件_第4页
C语言:25同步与死锁ppt课件_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

.,主讲老师:欧阳坚,欢迎您到(千锋学院)来学习!同步与死锁,.,生产者与消费者,两个进程共享缓冲区生产者进程只要发现缓冲区不满,就填充数据消费者进程只要发现缓冲区内有数据,就向外取,.,生产者与消费者,公共变量counter用来记录当前缓冲区中数据个数生产者填充数据后,执行counter+消费者取出数据后,执行counter-,.,生产者与消费者,两个进程并发,经打断和调度后,底层的指令乱序执行执行前counter的值是5执行完成后,生产者进程出错:counter+得到了4若T4和T5的执行顺序调换一下,消费者进程出错:counter-得到了6,.,生产者与消费者,多个进程并发操作公共变量公共变量的结果取决于执行顺序,出现竞争并发时执行顺序不确定解决办法:使得同时只有一个进程访问公共变量进程同步或协调使得运行结果不会互相干扰,.,临界区问题,临界区代码:修改公共变量,更新表格,写文件.一个进程进入临界区执行时其它进程不能进入临界区内核内部:打开文件列表非抢占式内核不严重:winxp,win2000抢占式内核问题严重:linux,solaries解决办法应满足互斥前进有限等待,.,软件解决办法,i和j两个进程共享变量turn表示允许进程进入临界区flagt为真表示进程t准备进入思想:两个进程互相谦让,先谦让的先行,后让者后走只是一个算法思路,无法保证在不同架构机器上运行,.,互斥锁,用锁来保护临界区进入临界之前先申请锁出临界区时释放锁构造互斥锁很复杂单处理机通过关中断实现非抢占式内核使用多处理机上关中断花时间,.,硬件锁,通过原子操作TestAndSet构造锁把lock置成true,并返回原值返回true说明锁被人持有返回false同时得到锁,.,硬件锁,使用交换原子操作构造锁,.,硬件锁,实现了有限等待的算法,.,信号量,锁使用复杂,多处理机上硬件实现困难信号量是一个整数,有两个原子操作P和VP(wait)V(increament),.,信号量,计数信号量:1-N二进制信号量(互斥锁):0,1二进制信号量可用于解决临界区问题计数信号量用于解决多个进程访问数量有限的资源解决同步问题,进程1的某语句先执行,进程程2后执行,.,信号量,缺点:需要忙等,浪费CPU周期优点:不需要上下文切换消除忙等:把等待信号量的进程转入挂起状态等信号量大于零时唤醒每个信号量有一个等待队列,.,信号量,.,信号量实现,回归到一个临界区问题单处理机上关中断多处理机上忙等(spinlock)临界区很短,.,死锁,两个或多个进程在待一个事件而这个事件需要某个处于等待的进程执行signal操作,.,生产消费者问题,intfull;/*当前缓冲区内数据个数*/intempty;/*当前缓冲区内空闲的个数*/intmutex;/*提供对缓冲区的互斥操作,初始化为1*/,.,生产者,.,消费者,.,读者写者问题,多个并发的进程共享一个数据库读者:只读数据库的进程写者:更新数据库的进程两个或多个读者同时访问,结果正确一个写者和另外的进程去同时访问,出现混乱变种1:读者不会因为有写者在等待而等待别的读者变种2:写者优先,写者需要更新数据时尽快访问,.,读者写者问题,.,哲学家就餐,.,监视器,信号量要求各个进程都符合使用规范一个进程编程错误就会导致数据出错或死锁一种抽象数据类型:私有数据和公共方法绑定操作在监视器内部互斥监视器保证进入的进程同时只能有一个处于活动状态使用者提供条件变量用于同步conditionxx.wait调用进程挂起x.signal恢复一个调用进程,若没有处于挂起的进程,就什么效果都不发生,与信号量不同,.,监视器,.,监视器,为保证监视器内部同时只能一个进程处于活动状态假如进程P对x执行signal时,进程Q处于挂起状态等xsignalandwaitP等Q离开监视器或等待另一条件变量signalandcontinueQ等P离开监视器或等待另一条件变量,.,监视器实现,对每一个监视器使用一个信号量mutex,初始为1想进入监视器进程需要先wait(mutex)离开监视器的进程必须signal(mutex)执行signal(mutex)的进程需要等待激活的进程next(初始为0),执行signal的进程可以在next挂起next_count表示在next上挂起的进程数每个外部函数里都要先等待mutex,.,监视器实现,条件变量的实现使用信号量对每个信号量x提供信号量x_sem和整数x_countx.waitx.signal,.,Linux进程同步,提供了信号量和spinlock多处理机上是spinlock,只能短期的持有单处理机上使用信号量,通过使能内核抢占实现,.,Linux进程同步,preempt_enablepreempt_disable处于内核态的任务持有锁时抢占是不安全的,preempt_count用于记录持有锁的数量,.,pthread同步,互斥锁条件变量读写锁有些实现提供了信号量有些实现提供了spinlock,.,pthread互斥锁,pthread_mutex_t静态分配初始化PTHREAD_MUTEX_INITIALIZER动态分配初始化intpthread_mutex_init(pthread_mutex_t*restrictmutex,constpthread_mutexattr_t*restrictattr);动态销毁intpthread_mutex_destroy(pthread_mutex_t*mutex);,.,pthread互斥锁,使用之前获得锁intpthread_mutex_lock(pthread_mutex_t*mutex);不阻塞接口intpthread_mutex_trylock(pthread_mutex_t*mutex);正确返回0,否则返回EBUSY使用完释放互斥锁intpthread_mutex_unlock(pthread_mutex_t*mutex);演示lockdemo,.,pthread互斥锁,互斥锁属性pthread_mutexattr_tintpthread_mutexattr_init(pthread_mutexattr_t*attr);intpthread_mutexattr_destroy(pthread_mutexattr_t*attr);进程间共享属性PTHREAD_PROCESS_PRIVATEPTHREAD_PROCESS_SHAREDintpthread_mutexattr_getpshared(constpthread_mutexattr_t*restrictattr,int*restrictpshared);intpthread_mutexattr_setpshared(pthread_mutexattr_t*attr,intpshared);,.,pthread互斥锁,互斥锁类型intpthread_mutexattr_gettype(constpthread_mutexattr_t*restrictattr,int*restricttype);intpthread_mutexattr_settype(pthread_mutexattr_t*attr,inttype);,.,pthread读写锁,允许高度的并行:未被锁,被读者锁住,被写者锁住每次只允许被一个写者锁住允许同时被多个读者锁住写者必须等待所有读者释放有写者等待时,读者会等待,.,pthread读写锁,intpthread_rwlock_init(pthread_rwlock_t*restrictrwlock,constpthread_rwlockattr_t*restrictattr);intpthread_rwlock_destroy(pthread_rwlock_t*rwlock);intpthread_rwlock_rdlock(pthread_rwlock_t*rwlock);intpthread_rwlock_wrlock(pthread_rwlock_t*rwlock);intpthread_rwlock_unlock(pthread_rwlock_t*rwlock);intpthread_rwlock_tryrdlock(pthread_rwlock_t*rwlock);intpthread_rwlock_trywrlock(pthread_rwlock_t*rwlock);,.,pthread读写锁,读写锁的属性:进程间共享intpthread_rwlockattr_init(pthread_rwlockattr_t*attr);intpthread_rwlockattr_destroy(pthread_rwlockattr_t*attr);intpthread_rwlockattr_getpshared(constpthread_rwlockattr_t*restrictattr,int*restrictpshared);intpthread_rwlockattr_setpshared(pthread_rwlockattr_t*attr,intpshared);,.,pthread条件变量,结合锁使用,允许线程以一种无竞争的方式等待条件发生用一个锁来保护条件变量,等待变量前先获得锁PTHREAD_COND_INITIALIZERintpthread_cond_init(pthread_cond_t*restrictcond,pthread_condattr_t*restrictattr);intpthread_cond_destroy(pthread_cond_t*cond);,.,pthread条件变量,intpthread_cond_wait(pthread_cond_t*restrictcond,pthread_mutex_t*restrictmutex);intpthread_cond_timedwait(pthread_cond_t*restrictcond,pthread_mutex_t*restrictmutex,conststructtimespec*restricttimeout);调用wait/timewait之前,必须先获得mutexwait/timewait会把调用线程放到条件变量的等待队列上并释放锁mutexwait/timewait返回时,再一次获得锁,.,pthread条件变量,intpthread_cond_signal(pthread_cond_t*cond);通知一个等待线程条件满足intpthread_cond_broadcast(pthread_cond_t*cond);通过所有等待线程条件满足,.,pthread条件变量,多个线程维护消息队列有消息到来时,线程把消息放到队列当队列中有消息时,取出并处理,.,pthread条件变量,.,pthread条件变量,把消息放入队列,并通知等待信号

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论