목차
잠금이 필요한 이유
Mutex(Mutex)
读写锁(RWMutex)
rrreee
백엔드 개발 Golang Go 언어 동시 프로그래밍에서 애플리케이션 잠금

Go 언어 동시 프로그래밍에서 애플리케이션 잠금

Mar 24, 2024 am 10:21 AM
go 언어로 가다 잠그다 경쟁 상대 동시 접속

Go 언어 동시 프로그래밍에서 애플리케이션 잠금

Go 언어는 원래 Google이 프로그래머 효율성과 시스템 성능을 향상시키기 위해 개발한 오픈 소스 프로그래밍 언어입니다. Go 언어는 동시에 여러 작업을 실행하는 동시 프로그래밍을 지원합니다. 이는 동시성 안전을 보장하는 일반적인 방법입니다. 이 기사에서는 동시 프로그램의 정확성을 보장하기 위해 Go 언어에서 잠금을 사용하는 방법을 살펴보고 구체적인 코드 예제를 제공합니다.

잠금이 필요한 이유

동시 프로그래밍에서는 여러 고루틴(Go 언어의 경량 스레드)이 동시에 공유 변수나 리소스에 액세스할 때 경쟁 조건(Race Condition)이 발생할 수 있습니다. 경쟁 조건으로 인해 데이터 불일치가 발생하고 심지어 프로그램이 충돌할 수도 있습니다. 이러한 상황이 발생하지 않도록 하려면 잠금을 사용하여 공유 리소스를 제어하고 보호해야 합니다.

Mutex(Mutex)

Mutex는 가장 일반적인 잠금 유형입니다. Mutex는 동시에 하나의 고루틴만 공유 리소스에 액세스할 수 있도록 보장합니다. Go 언어에서는 sync 패키지의 Mutex 유형을 사용하여 뮤텍스 잠금을 구현할 수 있습니다. sync包中的Mutex类型来实现互斥锁。

下面是一个简单的示例代码:

package main

import (
    "fmt"
    "sync"
)

var (
    balance int
    mu      sync.Mutex
)

func deposit(amount int) {
    mu.Lock()
    defer mu.Unlock()
    balance += amount
}

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 1000; i++ {
        wg.Add(1)
        go func() {
            deposit(10)
            wg.Done()
        }()
    }
    wg.Wait()

    fmt.Println("Final balance:", balance)
}
로그인 후 복사

在上面的代码中,我们定义了一个全局变量balance表示账户余额,以及一个互斥锁mu用来保护balance的访问。deposit函数负责向账户中存入金额,在存款过程中需要先调用mu.Lock()进行加锁,操作完成后再调用mu.Unlock()进行解锁。

main函数中启动1000个goroutine并发执行存款操作,通过sync.WaitGroup来等待所有goroutine执行完毕,最后打印出最终的账户余额。

读写锁(RWMutex)

除了互斥锁以外,Go语言也提供了读写锁(RWMutex)来实现读多写少的场景。读写锁允许多个goroutine同时读取共享资源,但在有写操作时会阻塞所有的读操作。

下面是一个使用读写锁的示例代码:

package main

import (
    "fmt"
    "sync"
)

var (
    data map[string]string
    mu   sync.RWMutex
)

func readData(key string) string {
    mu.RLock()
    defer mu.RUnlock()
    return data[key]
}

func writeData(key, value string) {
    mu.Lock()
    defer mu.Unlock()
    data[key] = value
}

func main() {
    data = make(map[string]string)
    var wg sync.WaitGroup
    for i := 0; i < 100; i++ {
        wg.Add(1)
        go func() {
            for j := 0; j < 1000; j++ {
                key := fmt.Sprintf("key%d", j)
                value := fmt.Sprintf("value%d", j)
                writeData(key, value)
                fmt.Println(readData(key))
            }
            wg.Done()
        }()
    }
    wg.Wait()
}
로그인 후 복사

在上面的代码中,我们定义了一个data变量作为共享的数据存储,以及一个读写锁mu用来保护对data的并发访问。readData函数用于读取指定key的数据,调用mu.RLock()进行读锁定;writeData函数用于写入key-value数据,调用mu.Lock()进行写锁定。

main函数中启动100个goroutine并发执行读写操作,并通过fmt.Println

다음은 간단한 샘플 코드입니다.

rrreee

위 코드에서는 계정 잔액을 나타내는 전역 변수 balance와 뮤텍스 잠금 mu를 정의합니다. 잔액에 대한 접근을 보호합니다. deposit 함수는 해당 금액을 계좌에 입금하는 역할을 담당하며, 입금 과정에서 먼저 mu.Lock()을 호출하여 잠근 후 를 호출해야 합니다. &gt;mu.Unlock()잠금을 해제합니다.

main 함수에서 1000개의 고루틴을 시작하여 동시에 입금 작업을 수행하고 sync.WaitGroup을 통해 모든 고루틴이 실행을 완료할 때까지 기다린 후 마지막으로 최종 계좌 잔액을 인쇄합니다. . 🎜🎜읽기-쓰기 잠금(RWMutex)🎜🎜Go 언어는 뮤텍스 잠금 외에도 읽기-쓰기 잠금(RWMutex)을 제공하여 읽기는 더 많고 쓰기는 적게 하는 시나리오를 달성합니다. 읽기-쓰기 잠금을 사용하면 여러 고루틴이 동시에 공유 리소스를 읽을 수 있지만 쓰기 작업이 있는 경우 모든 읽기 작업이 차단됩니다. 🎜🎜다음은 읽기-쓰기 잠금을 사용하는 샘플 코드입니다. 🎜rrreee🎜위 코드에서는 공유 데이터 저장소로 data 변수를 정의하고 읽기-쓰기 잠금 을 정의합니다. mu 데이터에 대한 동시 액세스를 보호하는 데 사용됩니다. readData 함수는 지정된 키의 데이터를 읽는 데 사용되며 읽기 잠금을 위해 mu.RLock()을 호출하는 데 사용됩니다. 키-값 데이터를 쓰려면 쓰기 잠금을 위해 mu.Lock()을 호출하세요. 🎜🎜main 함수에서 100개의 고루틴을 시작하여 읽기 및 쓰기 작업을 동시에 수행하고 fmt.Println을 통해 각 읽기 데이터를 인쇄합니다. 읽기-쓰기 잠금을 사용하면 프로그램의 동시성 성능이 향상되고 데이터 읽기 작업이 쓰기 작업으로 인해 차단되지 않도록 할 수 있습니다. 🎜🎜요약🎜🎜 이 글의 소개를 통해 우리는 Go 언어 동시 프로그래밍에서 잠금 사용의 중요성과 공유 리소스를 보호하고 경쟁 조건 발생을 방지하기 위해 뮤텍스 잠금 및 읽기-쓰기 잠금을 사용하는 방법을 이해했습니다. 실제 개발에서 잠금을 합리적으로 사용하면 프로그램의 동시성 성능을 향상시키고 프로그램의 정확성을 보장할 수 있습니다. 이 기사가 독자들이 Go 언어의 동시 프로그래밍에서 잠금 적용을 더 잘 이해하는 데 도움이 되기를 바랍니다. 🎜

위 내용은 Go 언어 동시 프로그래밍에서 애플리케이션 잠금의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

뜨거운 기사 태그

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Go WebSocket 메시지를 보내는 방법은 무엇입니까? Go WebSocket 메시지를 보내는 방법은 무엇입니까? Jun 03, 2024 pm 04:53 PM

Go WebSocket 메시지를 보내는 방법은 무엇입니까?

Golang 기술 성능 최적화에서 메모리 누수를 방지하는 방법은 무엇입니까? Golang 기술 성능 최적화에서 메모리 누수를 방지하는 방법은 무엇입니까? Jun 04, 2024 pm 12:27 PM

Golang 기술 성능 최적화에서 메모리 누수를 방지하는 방법은 무엇입니까?

Go에서 정규식을 사용하여 타임스탬프를 일치시키는 방법은 무엇입니까? Go에서 정규식을 사용하여 타임스탬프를 일치시키는 방법은 무엇입니까? Jun 02, 2024 am 09:00 AM

Go에서 정규식을 사용하여 타임스탬프를 일치시키는 방법은 무엇입니까?

golang 함수의 잠금은 어떻게 구현됩니까? golang 함수의 잠금은 어떻게 구현됩니까? Jun 05, 2024 pm 12:39 PM

golang 함수의 잠금은 어떻게 구현됩니까?

Golang과 Go 언어의 차이점 Golang과 Go 언어의 차이점 May 31, 2024 pm 08:10 PM

Golang과 Go 언어의 차이점

Golang 프레임워크 문서화 모범 사례 Golang 프레임워크 문서화 모범 사례 Jun 04, 2024 pm 05:00 PM

Golang 프레임워크 문서화 모범 사례

기계 학습에 사용되는 Golang 기술 라이브러리 및 도구 기계 학습에 사용되는 Golang 기술 라이브러리 및 도구 May 08, 2024 pm 09:42 PM

기계 학습에 사용되는 Golang 기술 라이브러리 및 도구

DeepSeek의 바쁜 서버 문제를 해결하는 방법 DeepSeek의 바쁜 서버 문제를 해결하는 방법 Mar 12, 2025 pm 01:39 PM

DeepSeek의 바쁜 서버 문제를 해결하는 방법

See all articles