用 vc 实 现 生 产 者 消 费 者 问 题
作 者 : 曹 建 峰
很 多 情 况 下 我 们 需 要 多 个 线 程 互 相 协 助 ,来 完 成 同 一 个 任 务 。但 是 线 程 很 难
从 外 部 进 行 控 制 。利 用 线 程 同 步 技 术 可 以 使 线 程 彼 此 交 互 ,从 而 避 免 了 外 部 控 制
对 与 时 间 和 资 源 的 浪 费 。在 实 际 工 作 过 程 中 我 就 遇 到 了 类 似 的 问 题 ,需 要 对 共 享
的 缓 冲 区 进 行 操 作 。有 插 入 的 线 程 也 有 读 取 的 线 程 ,这 使 我 忽 然 想 到 了 生 产 者 和
消 费 者 。 我 从 MSDN 找 到 CSDN, 使 用 了 各 式 各 样 的 搜 索 引 擎 , 只 找 到 了 很 有
限 的 关 于 CSemaphore 的 资 料 。
、 生 产 者 消 费 者 问 题
生 产 者 要 不 断 将 数 据 放 入 共 享 的 缓 冲 ,消 费 者 要 不 断 从 缓 冲 取 出 数 据 。消 费 者 必
须 等 生 产 者
取 走 数 据 后 才 能 再 放 新 数 据 (不 覆 盖 数 据 ),消 费 者 必 须 等 生 产 者 放 入 新 数 据 后 才
能 去 取 (不 重 复 )。
、 使 用 信 号 量 的 方 法
当 线 程 使 用 指 定 数 量 的 共 享 资 源 时 ,首 先 调 用 信 号 量 的 lock 方 法 "我 能 用 资 源 吗
"。 当 有 的 空 闲
共 享 资 源 时 (此 时 计 数 器 值 >0)线 程 继 续 执 行 并 且 减 少 计 数 器 的 数 量 告 诉 其 他 线
程 "我 用 了 ××个 资 源 "。 否 则 挂 起 自 己 直 到 有 足 够 的 可 用 的 资 源 为 止 。 当 使 用 完
资 源 时 线 程 调 用 unlock 方 法 告 诉 其 他 线 程 "我 已 经 不 用 该 资 源 了 "。
、 实 现
1、 创 建 一 个 基 于 对 话 框 的 程 序 。 添 加 如 下 成 员 :
//缓 慢 显 示 线 程 进 行 的 结 果
bool m_bSlow;
//生 产 者 线 程
CProducerThread *m_pProducerThread;
//消 费 者 线 程
CConsumerThread *m_pConsumerThread;
//缓 冲 空 的 标 志
CSemaphore* m_pSemaphoreEmpty;
//缓 冲 满 的 标 志