Next: , Previous: , Up: Pthreads   [Contents][Index]


6.27.1.3 Semaphores

協調的(cooperative)マルチタスカーは、 pause の 2 つの呼び出しの間に相互作用する他のタスクがないことを保証できます。 しかしながら、 pthread は実際には(少なくともマルチコア CPU 上では)並列(concurrent)タスクであるため、 同じリソースにアクセスする際の競合を回避するためのいくつかのテクニックが必要です。

セマフォ(semaphore)を取得できるのは 1 つのスレッドのみであり、 他のすべてのスレッドはセマフォが解放されるまで待機する必要があります。

semaphore ( "name" –  ) gforth-experimental “semaphore”

名前付きセマフォ name を作成します
name 実行時: ( – semaphore )

lock ( semaphore –  ) gforth-experimental “lock”

セマフォをロック(lock)

unlock ( semaphore –  ) gforth-experimental “unlock”

セマフォのロックを解除します(unlock)

同時アクセスを防ぐもう 1 つのアプローチが、 クリティカル・セクションです。 ここではクリティカル・セクションをセマフォで実装しているため、 クリティカル・セクションに使用するセマフォを指定する必要があります。 同一のセマフォを使用するクリティカル・セクション達のみが相互に排他的です。

critical-section ( xt semaphore –  ) gforth-experimental “critical-section”

semaphoreをロックした状態で xtexecute します。 xt を離れた後は、 それが例外の throw によるものであっても semaphore のロックが解除されます。