Rumah > pembangunan bahagian belakang > Golang > Pertimbangan keselamatan benang untuk penutupan Golang

Pertimbangan keselamatan benang untuk penutupan Golang

WBOY
Lepaskan: 2024-04-16 15:54:02
asal
578 orang telah melayarinya

Apabila menggunakan penutupan dalam persekitaran serentak, penutupan jenis rujukan (penutupan yang menangkap pembolehubah jenis rujukan) mestilah selamat untuk benang kerana pengubahsuaian padanya akan menjejaskan pembolehubah asal. Dua cara utama untuk membuat penutupan jenis rujukan selamat untuk benang ialah: menggunakan kunci mutex atau menggunakan struktur data yang tidak boleh diubah.

Pertimbangan keselamatan benang untuk penutupan Golang

Pertimbangan keselamatan benang untuk penutupan Go

Memahami pembolehubah yang ditangkap dalam penutupan

Dalam Go, penutupan boleh menangkap pembolehubah dalam skop yang ditakrifkan. Pembolehubah yang ditangkap ini dipanggil pembolehubah penutupan. Jika anda menggunakan penutupan dalam persekitaran serentak, adalah penting untuk memahami keselamatan benang pembolehubah penutupan.

Pembolehubah penutupan boleh menjadi jenis nilai atau jenis rujukan. Jenis nilai disalin apabila ditangkap, jadi pengubahsuaian pada pembolehubah penutupan tidak menjejaskan pembolehubah asal. Walau bagaimanapun, jenis rujukan dirujuk apabila ditangkap, jadi pengubahsuaian kepada pembolehubah penutupan juga mempengaruhi pembolehubah asal.

Penutupan jenis nilai

Contoh berikut menunjukkan penutupan jenis nilai:

package main

import "fmt"

func main() {
    x := 10
    f := func() {
        fmt.Println(x)
    }

    go f()
}
Salin selepas log masuk

Dalam contoh ini, pembolehubah penutupan x ialah jenis nilai, jadi x< Pengubahsuaian kepada /code> tidak akan menjejaskan pembolehubah asal di luar penutupan. <code>x 是一个值类型,因此对 x 的修改不会影响闭包外的原始变量。

引用类型闭包

下面的示例展示了一个引用类型闭包:

package main

import "fmt"

type Point struct {
    x, y int
}

func main() {
    p := Point{10, 20}
    f := func() {
        p.x = 30
    }

    go f()
}
Salin selepas log masuk

在这个示例中,闭包变量 p 是一个引用类型,因此对 p

Penutupan jenis rujukan

Contoh berikut menunjukkan penutupan jenis rujukan:

package main

import (
    "fmt"
    "sync"
)

type Point struct {
    x, y int
    mux sync.Mutex
}

func main() {
    p := Point{10, 20}
    f := func() {
        p.mux.Lock()
        defer p.mux.Unlock()
        p.x = 30
    }

    go f()
}
Salin selepas log masuk

Dalam contoh ini, pembolehubah penutupan p ialah jenis rujukan, jadi p< Pengubahsuaian kepada /code> juga akan mempengaruhi pembolehubah asal di luar penutupan. Oleh itu, apabila menggunakan penutupan jenis rujukan secara serentak, anda mesti memastikan bahawa akses kepada penutupan adalah selamat untuk benang.
  1. Penutupan selamat benang

    Terdapat dua cara utama untuk membuat penutupan jenis rujukan selamat benang:

  2. Menggunakan mutex: Mutex memastikan akses kepada pembolehubah penutupan adalah eksklusif. Contoh berikut menunjukkan cara menggunakan mutex untuk membenarkan penutupan mengubah suai pembolehubah jenis rujukan dengan selamat:

    package main
    
    import (
        "fmt"
        "sync"
    )
    
    type Point struct {
        x, y int
    }
    
    func (p Point) UpdateX(x int) Point {
        return Point{x: x, y: p.y}
    }
    
    func main() {
        p := Point{10, 20}
        f := func() {
            p = p.UpdateX(30)
        }
    
        go f()
    }
    Salin selepas log masuk

    Menggunakan struktur data tidak berubah:

    Struktur data tidak berubah memastikan keselamatan data melalui penyalinan. Contoh berikut menunjukkan cara menggunakan struktur data tidak berubah untuk membenarkan penutupan mengakses pembolehubah jenis rujukan dengan selamat: 🎜rrreee🎜🎜🎜 Dengan menggunakan mutex atau struktur data tidak berubah, anda boleh memastikan penutupan jenis rujukan disambungkan dalam selamat persekitaran serentak. 🎜

    Atas ialah kandungan terperinci Pertimbangan keselamatan benang untuk penutupan Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan