Python の Mutex
Ishaan Shrivastava
2021年10月22日
ミューテックスは相互排除を意味します。これは、特定の時間に、1つのスレッドのみが特定のリソースを使用できることを意味します。1つのプログラムにマルチスレッドがある場合、相互排除により、スレッドがその特定のリソースを同時に使用するように制限されます。他のスレッドをロックし、クリティカルセクションへのエントリを制限します。
このチュートリアルでは、Python でのミューテックスの使用方法を示します。
Python でミューテックスを実装するには、threading
モジュールの lock()
関数を使用してスレッドをロックします。2 番目のスレッドが最初のスレッドの前に終了しようとしている場合、最初のスレッドが終了するのを待ちます。これを確実にするために 2 番目のスレッドをロックしてから、最初のスレッドが終了するのを待ちます。そして、最初のスレッドが完了すると、2 番目のスレッドのロックを解除します。
以下のコードを参照してください。
import threading
import time
import random
mutex = threading.Lock()
class thread_one(threading.Thread):
def run(self):
global mutex
print("The first thread is now sleeping")
time.sleep(random.randint(1, 5))
print("First thread is finished")
mutex.release()
class thread_two(threading.Thread):
def run(self):
global mutex
print("The second thread is now sleeping")
time.sleep(random.randint(1, 5))
mutex.acquire()
print("Second thread is finished")
mutex.acquire()
t1 = thread_one()
t2 = thread_two()
t1.start()
t2.start()
出力:
The first thread is now sleeping
The second thread is now sleeping
First thread is finished
Second thread is finished
このコードでは、最初のスレッドが完了するまで、2 番目のスレッドは解放されません。2 番目のスレッドは、ロック内の最初のスレッドを待機します。両方のスレッドがそれを使用するため、コードでは global
キーワードが使用されます。スレッドが待機している限り、スレッドはまだ終了していないため、print
ステートメントは acquire
ステートメントの前ではなく直後に来ることに注意してください。
したがって、スレッドをロックすることは非常に重要です。そうしないと、2つのスレッドが同じリソースを同時に共有すると、アプリケーションがクラッシュする可能性があります。