RubyでMutexを使った排他制御の方法と実践

Ruby

Rubyでのスレッドを扱う際、複数のスレッドが同時にデータを操作しないようにするためには排他制御が必要です。Rubyでは、Mutex(ミューテックス)を使って排他制御を行うことができます。この記事では、Mutexを使用してスレッド間で安全にデータを扱う方法を紹介します。

1. Mutexとは

Mutex(Mutual Exclusion)は、「相互排他」の略で、複数のスレッドが同時にリソースにアクセスすることを防ぐための仕組みです。Rubyでは、スレッドが共有するリソースにアクセスする際に、Mutexを使うことで他のスレッドがそのリソースを操作するのを防ぎます。

2. Mutexの基本的な使い方

Mutexを使うには、まず`Mutex`オブジェクトを作成し、それを使ってリソースを保護します。基本的な使い方は以下の通りです。

require 'thread'

mutex = Mutex.new

# 共有リソース
shared_resource = 0

# スレッド1
thread1 = Thread.new do
  mutex.synchronize do
    shared_resource += 1
    puts "Thread 1: #{shared_resource}"
  end
end

# スレッド2
thread2 = Thread.new do
  mutex.synchronize do
    shared_resource += 2
    puts "Thread 2: #{shared_resource}"
  end
end

thread1.join
thread2.join

上記のコードでは、`mutex.synchronize`ブロック内でリソース`shared_resource`にアクセスしています。このようにすることで、スレッドが同時にリソースを変更することを防ぎます。

3. スレッドの競合を防ぐ

Mutexを使わない場合、スレッド間で競合状態が発生する可能性があります。例えば、スレッド1とスレッド2が同時にリソースにアクセスし、予期しない結果を生じることがあります。Mutexを使用することで、このような競合を防ぐことができます。

4. Mutexを使った排他制御の実例

以下のコードは、複数のスレッドで同じリソースを安全に操作する例です。

mutex = Mutex.new
counter = 0
threads = []

# 10個のスレッドを作成
10.times do
  threads << Thread.new do
    1000.times do
      mutex.synchronize do
        counter += 1
      end
    end
  end
end

# スレッドが終了するまで待機
threads.each(&:join)

puts "Final counter value: #{counter}"

このコードでは、複数のスレッドが`counter`というリソースを操作していますが、`mutex.synchronize`を使うことで、各スレッドがリソースに対して排他制御を行い、データが安全に更新されるようにしています。

まとめ

Rubyでスレッド間の競合を防ぐために、Mutexは非常に重要な役割を果たします。Mutexを使用することで、複数のスレッドが同時にデータを変更することを防ぎ、安全に並列処理を行うことができます。実際のプログラムでは、リソースにアクセスする部分で必ず`mutex.synchronize`を使用して排他制御を行いましょう。

コメント

タイトルとURLをコピーしました