ホームページ  >  記事  >  バックエンド開発  >  Go 言語の組み込みロックとミューテックス

Go 言語の組み込みロックとミューテックス

王林
王林オリジナル
2023-06-01 08:06:26695ブラウズ

Go 言語の組み込みロックとミューテックス

マルチコア プロセッサの普及により、マルチスレッド プログラミングはアプリケーション開発に不可欠な部分になりました。マルチスレッド プログラミングでは、ロックは共有リソースへの同時アクセスを制御するために使用される重要なメカニズムです。 Go 言語は豊富なロック メカニズムを提供しており、その中で最も一般的に使用されるのは組み込みロックとミューテックスです。

Bring your own lock

Bring your own lock は Go 言語のロック メカニズムであり、軽量で使いやすく、高性能です。組み込みロックは競合条件付き変数です。つまり、共有リソースに同時にアクセスする場合、複数のスレッドが同時に変数にアクセスすると競合条件が発生します。この場合、結果の不一致を避けるために同期が必要です。

Go 言語では、組み込みのロックを使用して同期操作を簡単に実行できます。組み込みロックには、Lock() と Unlock() という 2 つの重要なメソッドがあります。Lock() メソッドは、ロックを取得するために使用されます。ロックがすでに他のスレッドによって占有されている場合、呼び出し元のスレッドはブロック状態に入り、待機します。ロックを解放するには、Unlock() メソッドを使用します。

組み込みロックの使用例:

var mu sync.Mutex  // 定义一个锁变量
var count int

func main() {
    for i := 0; i < 1000; i++ {
        go add()  // 启动1000个线程,对count进行加1操作
    }
    time.Sleep(time.Second)  // 等待所有线程执行完成
    fmt.Println(count)  // 打印最终结果
}

func add() {
    mu.Lock()  // 获取锁
    count++  // 对共享变量进行操作
    mu.Unlock()  // 释放锁
}

上記のコードでは、グローバル変数 count が共有リソースとして使用され、1000 スレッドを開始することで 1 ずつ増加します。 count 変数への同時アクセスが競合状態を引き起こさないようにするために、同期には組み込みのロックが使用されます。 add() 関数では、まず mu.Lock() メソッドを呼び出してロックを取得し、共有リソースを操作してから、mu.Unlock() メソッドでロックを解放します。これにより、カウント変数の操作がアトミックになり、競合状態が回避されます。

Mutex

Mutex は Go 言語のもう 1 つのロック メカニズムであり、共有リソースを保護するためにも使用されます。ミューテックスは組み込みロックに似ており、競合状態の発生を防ぐために使用できますが、それに比べて、ミューテックスはよりきめ細かいコード ブロックに対する操作をロックおよびロック解除できます。

ミューテックスの使用は、それ自体のロックと似ています。 Go 言語では、ミューテックスのタイプは sync.Mutex で、プロトタイプは次のとおりです。

type Mutex struct {
    // 包含Mutex的内部结构
}

func (m *Mutex) Lock() {
    // 加锁操作
}

func (m *Mutex) Unlock() {
    // 解锁操作
}

ミューテックスを使用する場合は、Lock() と Unlock() の間の同期を必要とするコードも追加する必要があります。 ) メソッド、共有リソースの正確性を保証するブロック。

ミューテックスの使用例:

var mu sync.Mutex  // 定义一个互斥量
var count int

func main() {
    for i := 0; i < 1000; i++ {
        go add()  // 启动1000个线程,对count进行加1操作
    }
    time.Sleep(time.Second)  // 等待所有线程执行完成
    fmt.Println(count)  // 打印最终结果
}

func add() {
    mu.Lock()  // 获取锁
    count++  // 对共享变量进行操作
    mu.Unlock()  // 释放锁
}

組み込みロックの使用と同様に、上記のコードではミューテックスを使用して、共有リソース数へのアクセスを同期します。

概要

組み込みのロックとミューテックスは Go 言語の一般的な同期メカニズムであり、共有リソースを同時変更から保護するために使用されます。組み込みロックはコード ブロック全体のロックおよびロック解除操作に適していますが、ミューテックスはより詳細なコード ブロックに対してロックおよびロック解除操作を実行できます。実際の開発では、プログラムの信頼性と同時実行性を確保するために、特定のニーズに応じて適切なロック機構を選択する必要があります。

以上がGo 言語の組み込みロックとミューテックスの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。