13.07.2015 Views

Perl 语言编程 - Linux教程

Perl 语言编程 - Linux教程

Perl 语言编程 - Linux教程

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

条 事 件 以 唤 醒 其 他 正 在 等 待 事 件 到 来 的 线 程 。Thread 模 块 提 供 了 三 个 不 可 移 植 的 函 数 做 这些 事 情 : cond_wait,cond_signal, 和 cond_broadcast。 这 些 都 是 比 较 原 始 的 机 制 ,在 它 们 的 基 础 上 构 造 了 更 抽 象 的 模 块 , 比 如 Thread::Queue 和 Thread::Semaphore。如 果 可 能 的 话 , 使 用 那 些 抽 象 可 能 更 方 便 些 。cond_wait 函 数 接 受 一 个 已 经 被 当 前 的 线 程 锁 住 的 变 量 , 给 那 个 变 量 解 锁 , 然 后 阻 塞 住 直到 另 外 一 个 线 程 对 同 一 个 锁 住 了 的 变 量 做 了 一 次 cond_signal 或 者 cond_broadcast。被 cond_wait 阻 塞 住 的 变 量 在 cond_wait 返 回 以 后 重 新 锁 住 。 如 果 有 多 个 线 程 在cond_wait 这 个 变 量 , 那 么 只 有 一 个 线 程 重 新 阻 塞 , 因 为 它 们 无 法 重 新 获 得 变 量 的 锁 。 因此 , 如 果 你 只 使 用 cond_wait 进 行 同 步 工 作 , 那 么 应 该 尽 快 放 弃 变 量 锁 。cond_signal 函 数 接 受 一 个 已 经 被 当 前 线 程 锁 住 的 变 量 , 然 后 解 除 一 个 当 前 正 在cond_wait 该 变 量 的 线 程 的 阻 塞 。 如 果 不 止 一 个 线 程 阻 塞 在 对 该 变 量 的 cond_wait 上 ,只 有 解 除 一 个 的 阻 塞 , 而 且 你 无 法 预 料 是 哪 个 。 如 果 没 有 线 程 阻 塞 在 对 该 变 量 的cond_wait 上 , 该 事 件 被 丢 弃 。cond_broadcast 函 数 运 行 得 象 cond_signal, 但 是 解 除 所 有 在 锁 住 的 变 量 的cond_wait 的 线 程 的 阻 塞 , 而 不 只 是 一 个 。( 当 然 , 仍 然 是 某 一 时 刻 只 有 一 个 线 程 可 以 拥有 锁 住 的 变 量 。)cond_wait 应 该 是 一 个 线 程 在 条 件 没 有 得 到 满 足 后 的 最 后 的 手 段 。cond_signal 和cond_broadcast 表 明 条 件 已 经 改 变 了 。 我 们 假 设 各 个 事 件 的 安 排 是 这 样 的 : 锁 定 , 然 后检 查 一 下 看 看 是 否 满 足 你 需 要 的 条 件 ; 如 果 满 足 , 很 好 , 如 果 不 满 足 , cond_wait 直 到满 足 。 这 里 的 重 点 是 放 在 尽 可 能 避 免 阻 塞 这 方 面 的 。( 在 对 付 线 程 的 时 候 通 常 是 个 好 建 议 。)下 面 是 一 个 在 两 个 线 程 之 间 来 回 传 递 控 制 的 一 个 例 子 。 千 万 不 要 因 为 看 到 实 际 条 件 都 在 语 句修 饰 词 的 右 边 而 被 欺 骗 ; 除 非 我 们 等 待 的 条 件 是 假 的 , 否 则 决 不 会 调 用 cond_wait。use Thread qw(async cond_wait cond_signal);my $wait_var = 0;async {lock $wait_var;$wait_var = 1;cond_wait $wait_var until $wait_var == 2;cond_signal($wait_var);468

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!