条件变量(1) 个线程锁住互斥信号量进入临界区 在临界区,发现所需资源已被占用 锁住第二个互斥信号量(与被占资源相关的) 外面的互斥信号量将保持在关锁状态 拥有被占资源的线程不能进入临界区释放它 产生了死锁 如果解锁外面的互斥信号量 别的线程进入临界区,又会引起混乱
条件变量(1) 一个线程锁住互斥信号量进入临界区 在临界区,发现所需资源已被占用 锁住第二个互斥信号量(与被占资源相关的) 外面的互斥信号量将保持在关锁状态 拥有被占资源的线程不能进入临界区释放它 产生了死锁 如果解锁外面的互斥信号量 别的线程进入临界区,又会引起混乱
Lock mutex, Lock mutex: check data structures mark resource as busy; while(resource busy) unlock mutex: wait(condition variable); wakeup(condition variable) mark resource as busy unlock mutex; (b) 互斥信号量和条件变量的使用
Lock mutex; check data structures; while(resource busy) wait(condition variable); mark resource as busy; unlock mutex; (a) Lock mutex; mark resource as busy; unlock mutex; wakeup(condition variable); (b) 互斥信号量和条件变量的使用
条件变量(2) 解决方案:使用条件变量来申请资源 条件变量定义 原子性的自动地等待和解锁互斥信号量 当使用资源的线程释放资源后 它执行 wakeup操作 wakeup定义:一次可以唤一个线程 也可唤醒特定的条件变量上等待的所有线程 使用WHLE而不用 防止线程被唤醒但还没运行时,别的线程抢占资 源
条件变量(2) • 解决方案:使用条件变量来申请资源 • 条件变量定义 原子性的自动地等待和解锁互斥信号量 • 当使用资源的线程释放资源后 它执行 wakeup操作 • wakeup 定义:一次可以唤一个线程 也可唤醒特定的条件变量上等待的所有线程 使用WHILE而不用IF 防止线程被唤醒但还没运行时,别的线程抢占资 源
条件变量(2) 在创建条件变量时 每个条件变量常和一个互斥信号量关联 互斥信号量和条件变量的差别 互斥信号量用于短期的加锁,主要用于保护 临界区的入口 条件变量用于长期的等待,一直到资源可用 为止
条件变量(2) • 在创建条件变量时 每个条件变量常和一个互斥信号量关联 • 互斥信号量和条件变量的差别 互斥信号量用于短期的加锁,主要用于保护 临界区的入口 条件变量用于长期的等待,一直到资源可用 为止
线程与全局变量(1) 个线程通常拥有多个过程 过程含有局部变量、全局变量和过程参数 若变量对线程来说是全局的 但对整个程序来说是非全局的,会带来困难
线程与全局变量(1) 一个线程通常拥有多个过程 过程含有局部变量、全局变量和过程参数 若变量对线程来说是全局的 但对整个程序来说是非全局的,会带来困难