OK、共有変数へのリファレンスだ。変数の内部状態は破壊されないことを保証していることに注意。セクションで説明するように、ここを超えてしまうと保証はなくなってしまう。3.$aはどうなるだろうか?残念ながら、その答えは"場合によりけり"だ。変数$aにアクセスする。アルゴリズムから月の満ち欠けまでの種々の要因によって、$aは2にも3にもなりうる。error:競合条件は共有データに対して非同期なアクセスを行うことによって生じる。共有データに何も起こらないことを確実にする方法はない。3.二つのスレッドが$aにアクセスする。割り込まれたり、いずれかの順番で実行される可能性がある。$bと$cはともに2か3になるだろう。5や$a++でさえ、アトミックな演算であることを保証できない。踏まなければならない。陥るリスクを負うことになる。調整する多くのメカニズムをPerlは提供する。あるものはPerlに特化している。テクニックというものはぎこちないものであり、正しく扱うには難しい。うちのあるものを取り除いてくれる。total:lock()関数は共有変数を引数にとり、それにロックをかける。かけることができない。外に出るとロックは自動的に解除される。lock()の利用は率直なやり方だ。exits.ロックされている変数が利用可能になるまで、lock()はそのスレッドをブロックする。他のスレッドがその変数をロックできないことが確実になる。阻止するのだということに注意することが重要だ。itself.スカラー変数同様、配列やハッシュにもロックをかけるかもしれない。なく、配列そのものへのロックの試みをブロックする。example:ロックは再帰的、つまりスレッドはある変数に対し何度もロックをかけて大丈夫だ。外側のlock()がスコープを抜けるまでロックは続く。scope.unlock()関数は無いことに注意。抜けさせることだけだ。コードのセクションのようなものを守るために、ロックは用いられる。問題の変数は役に立つデータを持たず、ロックの目的のためにだけ存在する。基本的なセマフォのような振る舞いをするといえる。code:ロックはデータに同期アクセスするための便利なツールである。安全な共有データへの鍵となる。残念なことに、ロックには危険が伴う。複数のロックが関わるとそうなる。same.このプログラムは恐らくあなたがkillするまで固まってしまうだろう。ハングを保証する方法はもっと複雑だが、原理はこれと同じだ。lock.最初のスレッドが$aのロックを手にする。やっている間に一時停止した後、$bへのロックを手に入れようと試みる。その二つ目のスレッドは$bへのロックを手にする。開放されるの待つため、二番目のロックへの試みはブロックしてしまう。released.この状態をデッドロックという。リソースをロックしようと試みるときにはいつでも生じる。リソースへのロックを開放するのを待って、互いにスレッドがブロックする。リソースを持っているスレッドが自分自身のロックの開放を待つ場合は生じない。deadlock.この種の問題を扱う方法はたくさんある。正確に同じ順番でロックを獲得するようにさせることだ。ロックするなら、いつでも$bの前に$aを、そして$cの前に$bをロックするようにする。デッドロックの危険を最小にするために、短い時間だけロックを保持するのも良い手だ。problems.下記で説明するような他のプリミティブな同期も同様な問題を抱えうる。同期の問題を心配しなくてすむ、特別なスレッドセーフオブジェクトである。これらは非常に素朴で、こんな感じだ。Thread::Queueでキューを生成する。最後にスカラーのリストを追加する。キューのサイズは固定していない。保持する必要に応じてサイズは成長する。dequeue()はブロックする。コミュニケーションにとって、キューは理想的だ。time.セマフォは包括的なロックメカニズムの一種である。ならないことを除くと、ロック可能なスカラーそっくりに振舞う。"ロック"を持つことを可能にする。demonstration:セマフォは二つのメソッド、down()とup()を持つ。減少させ、up()の方は増加させる。down()の呼び出しはブロックする。once.このサブルーチンに対する三つの呼び出しは同時に作用する。スレッドだけが、グローバル変数にアクセスすることをセマフォが保証する。semaphores.デフォルトでは、セマフォはロックのように振舞う。セマフォには別の使い方がある。values:それぞれのセマフォは、関連付けられたカウンタを持つ。生成時、カウンタに1がセットされる。down()はカウンタから1を引き、up()は1を足す。カウンタが十分な大きさになるまでブロックする。対して行うことに注意すること。once.もちろん、問題はどうしてこんなことをするのかということだ。行うのか?その答えはリソースの利用可能性だ。多くのリソースは、同時に一つ以上のスレッドによって安全に利用される。drawing.例としてGUI駆動型のプログラムを取り上げてみよう。同期アクセスするためにセマフォを持っている。どのスレッドにも描画を始めてもらいたくはない。セマフォを生成するのだ。描画の準備ができたら、カウンタを増加させる。themselves.1より大きいカウンタを持つセマフォはクォータの確立にも役立つ。同時にI/Oを使うスレッドがいくつもあるとする。読み書きをするのは望まない。(あるいはオープンファイル数)で初期設定されたセマフォを利用すればよい。いうケースでは、大きな数で増減を行うのが便利だ。協調型スレッドに通知を行うために用いる。