Golang でスレッド セーフな関数を作成するには、次の方法を使用できます。 Mutex ミューテックスを使用して、一度に 1 つのスレッドのみがクリティカル セクションにアクセスできるようにします。読み取り/書き込みロック (RWMutex) を使用すると、複数のスレッドが同時にデータを読み取ることができますが、データを書き込むことができるのは 1 つのスレッドだけです。
#Golang でスレッドセーフな関数を作成するにはどうすればよいですか?
同時プログラミングでは、プログラム内のデータ競合やクラッシュを防ぐため、スレッド セーフは非常に重要です。 Golang では、sync
パッケージによって提供される同時実行プリミティブを使用して、スレッドセーフな関数を作成できます。
Mutex の使用
Mutex は最も基本的な同時実行プリミティブで、一度に 1 つのスレッドのみがクリティカル セクションにアクセスできるようにします。次に、ミューテックスを使用してスレッド セーフ関数を作成する例を示します。
import ( "sync" ) var mu sync.Mutex func ThreadSafeFunction() { mu.Lock() defer mu.Unlock() // 临界区代码 }
ThreadSafeFunction
この関数は、クリティカル セクションに入る前にミューテックスを取得し、クリティカル セクションを出るときにミューテックスを解放します。これにより、同時に 1 つのスレッドだけがクリティカル セクション コードにアクセスできるようになります。
読み取り/書き込みロックの使用
読み取り/書き込みロック (RWMutex) は、複数のスレッドが同時にデータを読み取ることを可能にする高度な同時実行プリミティブです。スレッド データを書き込むことができます。以下は、RWMutex を使用してスレッドセーフ関数を作成する例です。
import ( "sync" ) var rwmu sync.RWMutex func ThreadSafeFunction() { rwmu.RLock() defer rwmu.RUnlock() // 读取数据代码 rwmu.Lock() defer rwmu.Unlock() // 写入数据代码 }
ThreadSafeFunction
この関数は、RLock()
および RUnlock()# を使用します。 ## 読み取り操作には
Lock() と
Unlock() を書き込み操作に使用します。これにより、複数のスレッドが同時にデータを読み取ることができるため、同時実行性が向上します。
実践的なケース
同時アクセスを必要とする共有カウンターの例を考えてみましょう:import ( "sync" ) // Counter 是一个共享计数器 type Counter struct { sync.Mutex value int } // Increment 增加计数器的值 func (c *Counter) Increment() { c.Lock() defer c.Unlock() // 临界区代码 c.value++ } // Value 返回计数器的值 func (c *Counter) Value() int { c.Lock() defer c.Unlock() // 临界区代码 return c.value }この例では、
Counterこの構造では、Mutex を使用して、
Increment() 関数と
Value() 関数がスレッドセーフであることを保証します。複数のスレッドが
Value() 関数を同時に呼び出してカウンターの値を読み取ることができますが、
Increment() 関数を呼び出してカウンター値をインクリメントできるのは 1 つのスレッドだけです。
以上がGolang でスレッドセーフな関数を作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。