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.

$retval = $t2->join();print "1st kid returned @retlist\n";print "2nd kid returned $retval\n";实 际 上 , 一 个 线 程 的 返 回 表 达 式 总 是 在 列 表 环 境 里 计 算 的 , 即 使 jion 是 在 一 个 标 量 环 境 里调 用 的 也 如 此 , 那 种 情 况 下 返 回 列 表 的 最 后 一 个 值 。17.2.1.3 捕 获 来 自 join 的 例 外如 果 一 个 线 程 带 着 一 个 未 捕 获 的 例 外 终 止 , 不 会 立 即 杀 死 整 个 程 序 。 这 就 有 点 头 疼 了 。 相 比之 下 , 如 果 一 个 join 在 那 个 线 程 上 运 行 , 那 么 join 本 身 会 抛 出 例 外 。 在 一 个 线 程 上 使 用了 join 意 味 着 愿 意 传 播 该 线 程 抛 出 的 例 外 。 如 果 你 宁 可 到 处 捕 获 这 些 例 外 , 那 么 使 用 eval方 法 , 它 就 象 一 个 内 建 的 配 对 儿 , 导 致 例 外 被 放 进 $@:$retval = $t->eval(); # 捕 获 join 错 误 if ($@) { warn "thread failed: $@"; }else { print "thread returned $retval\n"; }你 在 实 际 中 可 能 还 是 只 想 在 创 建 被 连 接 的 线 程 的 那 个 线 程 里 连 接 该 线 程 —— 尽 管 我 们 没 有这 个 影 响 的 规 则 。 也 就 是 说 , 你 只 从 父 线 程 里 终 止 子 线 程 。 这 样 可 以 比 较 方 便 地 跟 踪 你 应 该在 那 里 操 作 哪 个 例 外 。17.2.1.4 detach 方 法这 是 另 外 一 个 终 止 线 程 的 方 法 , 如 果 你 不 准 备 稍 后 join 一 个 线 程 以 获 取 它 的 返 回 值 , 那 么你 可 以 对 它 调 用 detach 方 法 , 这 样 <strong>Perl</strong> 会 为 你 清 理 干 净 。 然 后 该 线 程 就 不 能 再 被 连 接了 。 它 有 点 象 Unix 里 的 一 个 进 程 继 承 给 init, 不 过 在 Unix 里 这 么 做 唯 一 的 方 法 是 父 进程 退 出 。detach 方 法 并 不 把 该 线 程 “ 放 到 后 台 ”; 如 果 你 试 图 退 出 主 程 序 并 且 一 个 已 发 配 的 线 程 仍 在运 行 , 那 么 退 出 过 程 将 挂 起 , 直 到 该 线 程 自 己 退 出 。 更 准 确 一 点 说 ,detach 只 是 替 你 做 清理 工 作 。 它 只 是 告 诉 <strong>Perl</strong> 在 该 线 程 退 出 之 后 不 必 再 保 留 它 的 返 回 值 和 退 出 状 态 。 从 某 种 意义 上 来 说 ,detach 告 诉 <strong>Perl</strong> 当 该 线 程 结 束 后 做 一 个 隐 含 的 join 并 且 丢 掉 结 果 。 这 一 点很 重 要 , 如 果 你 既 不 join 也 不 detach 一 个 返 回 巨 大 列 表 的 线 程 , 那 么 那 部 分 存 储 空 间将 直 到 结 束 时 都 不 能 使 用 , 因 为 <strong>Perl</strong> 将 不 得 不 为 以 后 ( 在 我 们 的 例 子 里 是 非 常 以 后 ) 可 能会 出 现 的 某 个 家 伙 想 join 该 线 程 的 机 会 挂 起 。459

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

Saved successfully!

Ooh no, something went wrong!