スレッドの同期


スレッドを使うとき、複数のスレッドが共有する資源(グローバル変数など)にアクセスすることがあります。このようなとき、適切にスレッドの同期を取らないと、正しく動作しないことがあります。

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