Python の Mutex

Ishaan Shrivastava 2021年10月22日
Python の Mutex

ミューテックスは相互排除を意味します。これは、特定の時間に、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つのスレッドが同じリソースを同時に共有すると、アプリケーションがクラッシュする可能性があります。