CSemaphore
一 个 CSemaphore 类 对 象 代 表 一 个 “ 信 号 ” – – – 一 个 同 步 对 象 , 它 允 许 有 限 数 目的 线 程 在 一 个 或 多 个 进 程 中 访 问 同 一 个 资 源 。 一 个 CSemaphore 对 象 保 持 了 对当 前 访 问 某 一 指 定 资 源 的 线 程 的 计 数 。
对 于 一 个 只 能 支 持 有 限 数 目 用 户 的 共 享 资 源 来 说 , CSemaphore 是 很 有 用 的 。
CSemaphore 对 象 的 当 前 计 数 是 还 可 以 允 许 的 其 它 用 户 的 数 目 。 当 这 个 计 数 达到 零 的 时 候 , 所 有 对 这 个 由 CSemaphore 对 象 控 制 的 资 源 的 访 问 尝 试 都 将 被 插入 到 一 个 系 统 队 列 中 等 待 , 直 到 它 们 的 时 间 用 完 或 计 数 值 不 再 为 零 。 这 个 被 控制 的 资 源 可 以 同 时 接 受 访 问 的 最 大 用 户 数 目 是 在 CSemaphore 对 象 的 构 造 期 间被 指 定 的 。
要 使 用 一 个 CSemaphore 对 象 , 则 在 需 要 的 时 候 构 造 这 个 对 象 。 指 定 你 想 要 等待 的 信 号 的 名 字 , 应 用 程 序 应 该 在 最 初 就 拥 有 它 。 然 后 你 就 可 以 在 构 造 函 数 返回 时 访 问 这 个 信 号 。 当 你 要 访 问 这 个 被 控 制 的 资 源 时 , 调 用CSyncObject::Unlo c k 。
使 用 CSemaphore 对 象 的 另 一 种 方 法 是 , 将 一 个 CSemaphore 类 型 的 变 量 添 加 到你 想 要 控 制 的 类 中 作 为 一 个 数 据 成 员 。 在 被 控 制 对 象 的 构 造 期 间 , 调 用CSemaphore 数 据 成 员 的 构 造 函 数 来 指 定 访 问 计 数 的 初 始 值 , 访 问 计 数 的 最 大
值 , 信 号 的 名 字 ( 如 果 它 要 在 整 个 进 程 中 使 用 ) , 以 及 需 要 的 安 全 标 志 。
要 访 问 由 CSemaphore 对 象 用 这 种 方 式 控 制 的 资 源 , 首 先 要 在 你 的 资 源 的 访 问成 员 函 数 中 创 建 一 个 CSingleLock 类 型 或 CMultiLock 类 型 的 变 量 。 然 后 调 用 加锁 对 象 的 Lock 成 员 函 数 ( 例 如 , CSingleLock::Lock ) 。 这 时 , 你 的 线 程 将 达到 对 资 源 的 访 问 , 等 待 资 源 被 释 放 并 访 问 它 , 或 者 是 在 等 待 资 源 被 释 放 的 过 程中 超 过 了 时 间 , 对 资 源 的 访 问 失 败 。 不 管 是 哪 一 种 情 况 , 你 的 资 源 都 是 以 一 种线 程 安 全( thread-safe )方 式 被 访 问 的 。要 释 放 资 源 ,可 以 使 用 加 锁 对 象 的 Unlock 成 员 函 数 ( 例 如 , CSingleLock::Unlock) , 或 者 是 让 加 锁 对 象 超 越 范 围 。
另 外 , 你 可 以 单 独 创 建 一 个 CSemaphore 对 象 , 并 且 在 尝 试 访 问 被 控 制 的 资 源
之 前 显 式 地 访 问 CSemaphore 对 象 。 这 种 方 法 虽 然 对 阅 读 你 的 源 代 码 的 人 来 说更 加 清 楚 , 但 是 却 更 易 于 出 错 。
#include <afxmt.h>
CSemaphore 类 成 员
Construction
Csemaphore 构 造 一 个 CSemaphore 对 象
成 员 函 数
CSemaphore:: CSemaphore
CSemaphore( LONG lInitialCount = 1, LONG l MaxCount = 1, LPCTSTR pstrName
= NULL,
LPSECURITY_ATTRIBUTES lpsaAttributes = NULL );
参 数
lInitialCount
信 号 的 初 始 使 用 计 数 。 必 须 是 大 于 或 等 于 0 , 并 且 小 于 或 等 于 lM axCount 。
lMaxCount
信 号 的 使 用 计 数 的 最 大 值 。 必 须 大 于 0 。
pstrName
信 号 的 名 字 。 如 果 此 信 号 将 在 整 个 进 程 中 被 访 问 , 则 必 须 提 供 这 个 名 字 。如 果 是 NULL , 则 对 象 将 是 没 有 名 字 的 。 如 果 这 个 名 字 与 一 个 已 经 存 在的 信 号 的 名 字 一 样 , 则 构 造 函 数 创 建 一 个 新 的 CSemaphore 对 象 , 此 对 象引 用 具 有 这 个 名 字 的 对 象 。 如 果 这 个 名 字 与 一 个 已 经 存 在 的 但 不 是 一 个信 号 的 同 步 对 象 的 名 字 一 样 , 则 构 造 函 数 会 失 败 。
lpsaAttributes
此 信 号 对 象 的 安 全 标 志 。 有 关 这 个 结 构 的 详 细 描 述 , 参 见 “ W in32 SDK
程 序 员 参 考 ” 中 的 SECURITY_ATTRIBUTE S。
说 明
此 成 员 函 数 用 来 构 造 一 个 有 名 字 或 没 有 名 字 的 CSemaphore 对 象 。 要 访 问 或 释放 一 个 CSemaphore 对 象 , 可 以 创 建 一 个 CMultiLock 或 CSingleLock 对 象 , 并调 用 它 们 的 Lock 和 Unlock 函 数 。
请 参 阅 CMutex, CEvent, CMultiLock, CSingleLock