Jadual Kandungan
Kandungan soalan
Penyelesaian
Rumah pembangunan bahagian belakang Golang Adakah menggantikan pembolehubah dipetakan dengan benang objek dipetakan baharu selamat?

Adakah menggantikan pembolehubah dipetakan dengan benang objek dipetakan baharu selamat?

Feb 10, 2024 pm 04:33 PM
akses serentak pasangan nilai kunci

Adakah menggantikan pembolehubah dipetakan dengan benang objek dipetakan baharu selamat?

Editor PHP Apple hadir untuk menjawab soalan biasa: "Adakah ia selamat untuk menggantikan pembolehubah pemetaan dengan objek pemetaan baharu?" Pembolehubah pemetaan ialah struktur data biasa yang digunakan untuk menyimpan pasangan nilai kunci. Dalam persekitaran berbilang benang, keselamatan benang adalah pertimbangan penting. Walaupun menggunakan objek pemetaan baharu boleh mengelakkan masalah akses serentak, sama ada ia selamat untuk benang masih perlu dinilai berdasarkan kes demi kes. Seterusnya, kami akan meneroka isu ini secara mendalam untuk membantu pembaca lebih memahami hubungan antara keselamatan benang dan objek yang dipetakan.

Kandungan soalan

Saya rasa ia tidak selamat untuk benang kerana objek yang dipetakan lebih besar daripada perkataan mesin dan golang tidak menjamin ia selamat untuk benang. Tetapi apabila saya menjalankan kod demo menggunakan go run -race main.go ia tidak pernah melaporkan ralat. Ini mungkin sebab mengapa threadsanitizer bergantung pada semakan masa jalan dan operasi penugasan untuk mendapati sukar untuk memenuhi keadaan tidak selamat benang.

Berikut ialah kod contoh:

package main

import (
    "fmt"
)

var m = make(map[int]bool)

func Read() {
    for {
        for k := range m {
            fmt.Println(k)
        }
    }
}

func Replace() {
    for {
        newM := make(map[int]bool, 10)
        for i := 0; i < 10; i++ {
            newM[i] = false
        }
        m = newM
    }
}

func main() {
    c := make(chan struct{})

    go Read()
    go Replace()

    <-c
}

Salin selepas log masuk

Jadi bagaimana saya boleh mengubah suai kod untuk mencetuskan ralat konkurensi? Atau mungkin saya salah dan kod itu selamat untuk benang?

Penyelesaian

Berikut adalah beberapa perkara yang perlu diberi perhatian:

for k := range m {
Salin selepas log masuk

Ekspresi julat dinilai sekali pada permulaan gelung untuk. Jadi operasi ini akan membaca m 一次(注意,这意味着如果循环中的代码重新分配 m ,则循环将继续迭代原始 m ,但是如果添加新元素或从 m 中删除元素,这些将被检测到循环),循环本身会调用 fmt.println , yang akan memakan sebahagian besar masa pelaksanaan dalam goroutine ini. Jika anda ingin mengejar permainan, padamkannya.

Kedua, anda sebenarnya tidak perlu memulakan peta kedua.

Apabila anda melakukan ini dan menjalankan pengesan perlumbaan, ia mungkin menangkap perlumbaan data. Setakat yang saya bimbang, ia berlaku.

Pengesan perbalahan akan mengadu tentang perbalahan apabila ia mengesannya. Jadi jika ia melaporkan perlawanan, maka ada perlawanan. Jika tidak dilaporkan, tidak bermakna tiada peraduan.

Pada platform saya, pembolehubah peta itu sendiri sebenarnya sama saiznya dengan perkataan mesin: ia hanyalah penunjuk kepada struktur yang dipetakan. Oleh itu, penulisan kepada pembolehubah dipetakan adalah secara atomik, iaitu anda tidak akan melihat pemetaan yang diperuntukkan sebahagiannya pada platform ini. Walau bagaimanapun, ini tidak menghalang perbalahan kerana tiada jaminan bila goroutine lain akan melihat memori ini ditulis.

Ringkasnya, ia adalah satu pertandingan. Ini bukan kerana saiz pembolehubah peta. Untuk membetulkannya, gunakan mutex.

Atas ialah kandungan terperinci Adakah menggantikan pembolehubah dipetakan dengan benang objek dipetakan baharu selamat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Repo: Cara menghidupkan semula rakan sepasukan
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Perbezaan antara kurungan segi empat sama dan kurungan kerinting dalam Vue Perbezaan antara kurungan segi empat sama dan kurungan kerinting dalam Vue May 02, 2024 pm 10:06 PM

Tanda kurung persegi digunakan untuk mengakses elemen tatasusunan, pengikatan sifat dinamik dan sifat yang dikira, manakala kurungan kerinting digunakan untuk mencipta literal objek, ungkapan templat dan kaedah panggilan. Penggunaan yang betul bagi simbol-simbol ini dalam Vue.js adalah penting untuk pemprosesan data yang cekap dan mencipta aplikasi interaktif.

Bagaimana untuk memastikan keselamatan benang pembolehubah tidak menentu dalam fungsi Java? Bagaimana untuk memastikan keselamatan benang pembolehubah tidak menentu dalam fungsi Java? May 04, 2024 am 10:15 AM

Kaedah untuk memastikan keselamatan benang bagi pembolehubah tidak menentu di Jawa: Keterlihatan: Pastikan pengubahsuaian kepada pembolehubah tidak menentu oleh satu utas dapat dilihat dengan serta-merta kepada utas lain. Atomicity: Pastikan bahawa operasi tertentu pada pembolehubah tidak menentu (seperti menulis, membaca dan pertukaran perbandingan) tidak boleh dibahagikan dan tidak akan diganggu oleh urutan lain.

Apakah perangkap yang perlu kita perhatikan semasa mereka bentuk sistem teragih dengan teknologi Golang? Apakah perangkap yang perlu kita perhatikan semasa mereka bentuk sistem teragih dengan teknologi Golang? May 07, 2024 pm 12:39 PM

Perangkap dalam Bahasa Go Semasa Merekabentuk Sistem Teragih Go ialah bahasa popular yang digunakan untuk membangunkan sistem teragih. Walau bagaimanapun, terdapat beberapa perangkap yang perlu diberi perhatian apabila menggunakan Go yang boleh menjejaskan kekukuhan, prestasi dan ketepatan sistem anda. Artikel ini akan meneroka beberapa perangkap biasa dan memberikan contoh praktikal tentang cara mengelakkannya. 1. Terlalu banyak menggunakan concurrency Go ialah bahasa concurrency yang menggalakkan pembangun menggunakan goroutine untuk meningkatkan paralelisme. Walau bagaimanapun, penggunaan konkurensi yang berlebihan boleh menyebabkan ketidakstabilan sistem kerana terlalu banyak gorout bersaing untuk mendapatkan sumber dan menyebabkan overhed penukaran konteks. Kes praktikal: Penggunaan concurrency yang berlebihan membawa kepada kelewatan respons perkhidmatan dan persaingan sumber, yang ditunjukkan sebagai penggunaan CPU yang tinggi dan overhed kutipan sampah yang tinggi.

Cara menggunakan peta dalam vue Cara menggunakan peta dalam vue May 02, 2024 pm 09:54 PM

Peta digunakan dalam Vue.js untuk menyimpan pasangan nilai kunci, yang mana kuncinya boleh daripada sebarang jenis data. Kaedah penggunaan termasuk: mencipta Peta, menambah dan mengakses data, memadam data dan merentasi data. Peta responsif dan mengemas kini paparan secara automatik apabila ia berubah.

Struktur dan algoritma data Java: penjelasan mendalam Struktur dan algoritma data Java: penjelasan mendalam May 08, 2024 pm 10:12 PM

Struktur data dan algoritma ialah asas pembangunan Java Artikel ini meneroka secara mendalam struktur data utama (seperti tatasusunan, senarai terpaut, pepohon, dll.) dan algoritma (seperti pengisihan, carian, algoritma graf, dll.) dalam Java. Struktur ini diilustrasikan dengan contoh praktikal, termasuk menggunakan tatasusunan untuk menyimpan skor, senarai terpaut untuk mengurus senarai beli-belah, tindanan untuk melaksanakan rekursi, baris gilir untuk menyegerakkan benang, dan pepohon dan jadual cincang untuk carian dan pengesahan pantas. Memahami konsep ini membolehkan anda menulis kod Java yang cekap dan boleh diselenggara.

Panduan untuk menguji unit fungsi serentak Go Panduan untuk menguji unit fungsi serentak Go May 03, 2024 am 10:54 AM

Unit menguji fungsi serentak adalah penting kerana ini membantu memastikan kelakuan mereka yang betul dalam persekitaran serentak. Prinsip asas seperti pengecualian bersama, penyegerakan dan pengasingan mesti dipertimbangkan semasa menguji fungsi serentak. Fungsi serentak boleh diuji unit dengan mensimulasikan, menguji keadaan perlumbaan dan mengesahkan keputusan.

Cara menyelesaikan masalah pelayan yang sibuk untuk DeepSeek Cara menyelesaikan masalah pelayan yang sibuk untuk DeepSeek Mar 12, 2025 pm 01:39 PM

DeepSeek: Bagaimana menangani AI yang popular yang sesak dengan pelayan? Sebagai AI panas pada tahun 2025, DeepSeek adalah sumber percuma dan terbuka dan mempunyai prestasi yang setanding dengan versi rasmi OpenAIO1, yang menunjukkan popularitinya. Walau bagaimanapun, kesesuaian yang tinggi juga membawa masalah kesibukan pelayan. Artikel ini akan menganalisis sebab -sebab dan menyediakan strategi mengatasi. DeepSeek Web Version Masuk: https://www.deepseek.com/deepseek Server Sibuk Sebab: Akses serentak yang tinggi: Ciri -ciri percuma dan berkuasa DeepSeek menarik sejumlah besar pengguna untuk digunakan pada masa yang sama, mengakibatkan beban pelayan yang berlebihan. Serangan Siber: Dilaporkan bahawa DeepSeek mempunyai kesan terhadap industri kewangan AS.

Bagaimana untuk menangani keadaan perlumbaan dan keadaan perlumbaan dalam pengaturcaraan serentak Java? Bagaimana untuk menangani keadaan perlumbaan dan keadaan perlumbaan dalam pengaturcaraan serentak Java? May 08, 2024 pm 04:33 PM

Dalam pengaturcaraan serentak Java, keadaan perlumbaan dan keadaan perlumbaan boleh membawa kepada tingkah laku yang tidak dapat diramalkan. Keadaan perlumbaan berlaku apabila berbilang utas mengakses data kongsi pada masa yang sama, mengakibatkan keadaan data tidak konsisten, yang boleh diselesaikan dengan menggunakan kunci untuk penyegerakan. Keadaan perlumbaan ialah apabila berbilang benang melaksanakan bahagian kritikal yang sama pada masa yang sama, yang membawa kepada hasil yang tidak dijangkakan operasi atom boleh dipastikan dengan menggunakan pembolehubah atom atau kunci.

See all articles