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.

{lock $var;if ($var == 0) {yield;$var++;}} # 锁 在 这 里 释 放# 其 他 不 用 锁 定 $var 的 代 码}17.2.2.2 死 锁死 锁 是 线 程 程 序 员 的 毒 药 , 因 为 很 容 易 偶 然 地 就 死 锁 了 , 但 即 使 你 努 力 做 好 却 很 难 避 免 。 下面 是 一 个 死 锁 的 简 单 的 例 子 :my $t1 = async { lock $a; yield; lock $b; $a++; $b++ };my $t2 = async { lock $b; yield; lock $a; $b++; $a++ };解 决 方 法 是 对 于 所 有 需 要 某 个 锁 集 合 的 当 事 方 , 都 必 须 按 照 相 同 的 顺 序 获 取 锁 。把 你 持 有 锁 的 时 间 最 小 化 也 是 很 好 的 做 法 。( 至 少 出 于 性 能 的 考 虑 也 是 好 的 。 但 是 如 果 你 只是 为 了 减 少 死 锁 的 风 险 , 那 么 你 所 做 的 只 是 让 复 现 问 题 和 诊 断 问 题 变 得 更 难 。)17.2.2.3 锁 定 子 过 程你 可 以 在 一 个 子 过 程 上 加 一 把 锁 :lock &func;和 数 据 锁 不 一 样 , 数 据 锁 只 有 劝 告 性 锁 , 而 子 过 程 锁 是 强 制 性 的 。 除 了 拥 有 锁 的 线 程 以 外 其它 线 程 都 不 能 进 入 子 过 程 。考 虑 一 下 下 面 的 代 码 , 它 包 含 一 个 涉 及 $done 变 量 的 冲 突 条 件 。(yield 只 是 用 于 演 示 )。use Thread qw/async yield/;464

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

Saved successfully!

Ooh no, something went wrong!