13.07.2015 Views

Perl 语言编程 - Linux教程

Perl 语言编程 - Linux教程

Perl 语言编程 - Linux教程

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

的 函 数 。( 在 不 是 为 线 程 使 用 制 作 的 perl 版 本 里 调 用 lock 不 是 个 错 误 , 只 是 一 个 无 害 的“ 无 动 作 ”, 至 少 在 最 近 的 版 本 里 如 此 。)就 好 象 flock 操 作 符 只 是 阻 塞 其 它 的 flock 的 实 例 , 而 不 是 实 际 I/O 一 样 ,lock 也 只 是阻 塞 其 它 lock 的 实 例 , 而 不 是 普 通 的 数 据 访 问 。 实 际 上 , 它 们 也 是 劝 告 性 锁 定 。 就 象 交 通灯 一 样 。( 注 : 有 些 铁 路 十 字 路 口 是 强 制 性 锁 ( 那 些 有 门 的 ), 有 些 家 伙 认 为 lock 也 应 该是 强 制 性 的 。 不 过 想 象 一 下 , 如 果 现 实 世 界 中 的 每 个 十 字 路 口 都 有 升 降 杆 是 多 么 可 怕 。)你 可 以 锁 住 独 立 的 标 量 变 量 , 整 个 数 组 和 整 个 哈 希 。lock $var;lock @values;lock %table;不 过 , 在 一 个 聚 集 上 使 用 lock 并 非 隐 含 的 对 该 聚 集 的 每 一 个 标 量 元 素 都 锁 定 :lock @values; # 在 线 程 1...lock $values[23]; # 在 线 程 2 -- 不 会 阻 塞 !如 果 你 锁 定 一 个 引 用 , 那 么 也 自 动 锁 住 了 对 引 用 的 访 问 。 也 就 是 说 , 你 获 得 一 个 可 以 释 放 的析 引 用 。 这 个 技 巧 很 有 用 , 因 为 对 象 总 是 隐 藏 在 一 个 引 用 后 面 , 并 且 你 经 常 想 锁 住 对 象 。( 并且 你 几 乎 从 来 不 会 想 锁 住 引 用 。)当 然 , 交 通 灯 的 问 题 是 它 们 有 一 半 时 间 是 红 灯 , 这 时 候 你 只 能 等 待 。 同 样 ,lock 也 是 阻 塞性 调 用 —— 你 的 线 程 会 挂 起 , 直 到 获 得 了 锁 。 这 个 过 程 中 没 有 超 时 机 制 。 也 没 有 解 锁 设 施 ,因 为 锁 是 动 态 范 围 对 象 。 它 们 持 续 到 它 们 的 语 句 块 , 文 件 或 者 eval 的 结 束 。 如 果 它 们 超出 了 范 围 , 那 么 它 们 被 自 动 释 放 。锁 还 是 递 归 的 。 这 意 味 着 如 果 你 在 一 个 函 数 里 锁 住 了 一 个 变 量 , 而 且 该 函 数 在 持 有 锁 的 时 候递 归 , 那 么 同 一 个 线 程 可 以 再 次 成 功 地 锁 住 该 变 量 。 当 所 有 拥 有 锁 的 框 架 都 退 出 以 后 , 锁 才最 终 被 删 除 。下 面 是 一 个 简 单 的 演 示 程 序 , 看 看 如 果 没 有 锁 , 世 界 将 会 怎 样 。 我 们 将 用 yield 强 制 一 次环 境 切 换 以 显 示 在 优 先 级 调 度 的 时 候 也 可 能 偶 然 发 生 的 这 类 问 题 :use Thread qw/async yield/;my $var = 0;462

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

Saved successfully!

Ooh no, something went wrong!