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

Pertimbangan keselamatan benang untuk penutupan Golang

WBOY
WBOYasal
2024-04-16 15:54:02562semak imbas

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()
}

Dalam contoh ini, pembolehubah penutupan x ialah jenis nilai, jadi x 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()
}

在这个示例中,闭包变量 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()
}

Dalam contoh ini, pembolehubah penutupan p ialah jenis rujukan, jadi p 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. <ol> <li>Penutupan selamat benang<p><strong>Terdapat dua cara utama untuk membuat penutupan jenis rujukan selamat benang: </strong></p> </li> <li><p>Menggunakan mutex: <strong> Mutex memastikan akses kepada pembolehubah penutupan adalah eksklusif. Contoh berikut menunjukkan cara menggunakan mutex untuk membenarkan penutupan mengubah suai pembolehubah jenis rujukan dengan selamat: </strong><pre class='brush:go;toolbar:false;'>package main import ( &quot;fmt&quot; &quot;sync&quot; ) 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() }</pre></p></li> </ol> <p>Menggunakan struktur data tidak berubah: </p> 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!

Kenyataan:
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