スレッドの同期
スレッドを使うとき、複数のスレッドが共有する資源(グローバル変数など)にアクセスすることがあります。このようなとき、適切にスレッドの同期を取らないと、正しく動作しないことがあります。
Pythonには、同期を取るためのオブジェクトがいくつか用意されています。以下にPythonの同期オブジェクトを示します。
オブジェクト | 説明 |
Lock | "lock"と"unlock"状態を持つ単純な同期機構。 |
Condition Variables | 状態遷移に依存した動作が必要な場合利用する。 |
Semaphore | ある資源(複数)に対する要求をカウンタを用いて同期制御できる。 |
Event | スレッドが他のスレッドにシグナルを送るとき使う。 |
以下にLockを使ったサンプルを示します。
# lock object import thread n = 0 lck = thread.allocate_lock() def fadd() : global n global lck while 1: if lck.acquire() == 0 : pass else : n += 1 lck.release() def fdec() : global n global lck while 1: if lck.acquire() == 0 : pass else : n -= 1 lck.release() thread.start_new_thread(fadd, ()) thread.start_new_thread(fdec, ()) while 1: print n |