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.

程 化 的 <strong>Perl</strong> 写 出 足 够 坚 固 的 应 用 , 不 过 你 必 须 非 常 小 心 。 如 果 你 能 想 出 一 种 用 管 道 而 不 是用 共 享 数 据 结 构 的 方 法 解 决 你 的 问 题 的 话 , 那 么 你 至 少 应 该 考 虑 使 用 fork。不 过 如 果 多 个 任 务 能 够 容 易 且 有 效 地 访 问 同 一 组 数 据 池 ( 注 : 上 一 章 讨 论 的 System V 里的 共 享 内 存 的 模 型 并 不 算 “ 容 易 且 有 效 ”), 那 么 有 些 算 法 可 以 更 容 易 地 表 达 。 这 样 就 可 以 把代 码 写 的 更 少 和 更 简 单 。 并 且 因 为 在 创 建 线 程 的 时 候 内 核 并 不 必 为 数 据 拷 贝 内 存 页 表 ( 甚 至写 时 拷 贝 (copy-on-write) 都 不 用 ), 那 么 用 这 种 方 法 启 动 一 个 任 务 就 应 该 更 快 些 。 类 似 ,因 为 内 核 不 必 交 换 内 存 页 表 , 环 境 切 换 也 应 该 更 快 一 些 。( 实 际 上 , 对 于 用 户 级 线 程 而 言 ,内 核 根 本 不 用 参 与 —— 当 然 , 用 户 级 的 线 程 有 一 些 内 核 级 的 线 程 没 有 的 问 题 。)这 些 可 是 好 消 息 。 那 么 现 在 我 们 要 做 些 弃 权 声 明 。 我 们 已 经 说 过 线 程 在 <strong>Perl</strong> 里 是 某 种 试 验特 性 , 而 且 即 使 它 们 不 再 是 试 验 特 性 了 , 那 么 线 程 编 程 也 是 非 常 危 险 的 。 一 个 执 行 流 能 够 把另 外 一 个 执 行 流 的 数 据 区 捅 得 乱 七 八 糟 的 能 力 可 以 暴 露 出 比 你 能 想 象 得 更 多 的 导 致 灾 难 的机 会 。 你 可 能 会 对 自 己 说 ,“ 那 很 容 易 修 理 , 我 只 需 要 在 任 何 共 享 的 数 据 上 加 锁 就 可 以 了 。”不 错 , 共 享 数 据 的 锁 是 不 可 缺 少 的 , 不 过 设 计 正 确 的 锁 协 议 是 臭 名 昭 著 地 难 , 协 议 的 错 误 会导 致 死 锁 或 者 不 可 预 料 的 结 果 。 如 果 你 在 程 序 里 有 定 时 问 题 , 那 么 使 用 线 程 不 仅 会 恶 化 它 们 ,而 且 还 让 他 们 难 于 跟 踪 。你 不 仅 要 确 保 你 自 己 的 共 享 数 据 的 安 全 , 而 且 你 还 要 保 证 这 些 数 据 在 所 有 你 调 用 的 <strong>Perl</strong> 模块 和 C 库 里 安 全 。 你 的 <strong>Perl</strong> 代 码 可 以 是 100% 线 程 安 全 的 , 但 是 如 果 你 调 用 了 一 个 线程 不 安 全 的 模 块 或 者 C 的 子 过 程 , 而 又 没 有 提 供 你 自 己 的 信 号 灯 保 护 , 那 么 你 完 了 。 在 你能 证 明 之 前 , 你 应 该 假 设 任 何 模 块 都 是 现 成 不 安 全 的 。 那 些 甚 至 包 括 一 些 标 准 的 模 块 。 甚 至是 它 们 的 大 多 数 。我 们 有 没 有 让 你 泄 气 ? 没 有 ? 然 后 我 们 还 要 指 出 , 如 果 事 情 到 了 调 度 和 优 先 级 策 略 的 份 上 ,你 还 很 大 程 度 上 依 赖 你 的 操 作 系 统 的 线 程 库 的 慈 悲 。 有 些 线 程 库 在 阻 塞 的 系 统 调 用 的 时 候 只做 线 程 切 换 。 有 些 线 程 库 在 某 个 线 程 做 阻 塞 的 系 统 调 用 的 时 候 阻 塞 住 整 个 进 程 。 有 些 库 只 在时 间 量 超 时 (quantum expiration) 的 时 候 才 切 换 线 程 ( 线 程 或 者 进 程 )。 有 些 库 只 能 明确 地 切 换 线 程 。哦 , 对 了 , 如 果 你 的 进 程 接 收 到 一 个 信 号 , 那 么 信 号 发 送 给 哪 个 线 程 完 全 是 由 系 统 决 定 的 。如 果 想 在 <strong>Perl</strong> 里 写 线 程 程 序 , 你 必 须 制 作 一 个 特 殊 的 <strong>Perl</strong> 的 版 本 , 遵 照 <strong>Perl</strong> 源 程 序 目录 里 的 README.threads 文 件 的 指 示 就 可 以 了 。 这 个 特 殊 的 <strong>Perl</strong> 版 本 几 乎 是 可 以 肯 定要 比 标 准 的 版 本 慢 一 些 的 。请 不 要 觉 得 你 只 要 知 道 了 其 他 线 程 模 型 (POSIX,DEC,Microsoft, 等 等 ) 的 编 程 特 点 就认 为 自 己 认 识 了 <strong>Perl</strong> 的 线 程 的 运 转 模 式 。 就 象 <strong>Perl</strong> 里 的 其 他 东 西 一 样 , <strong>Perl</strong> 就 是<strong>Perl</strong>, 它 不 是 C++ 或 者 Java 或 者 其 他 什 么 东 西 。 比 如 ,<strong>Perl</strong> 里 没 有 实 时 线 程 优 先 级 ( 也455

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

Saved successfully!

Ooh no, something went wrong!