Rumah pembangunan bahagian belakang Tutorial C#.Net Cara menangani penyegerakan benang dan isu dan penyelesaian akses serentak dalam pembangunan C#

Cara menangani penyegerakan benang dan isu dan penyelesaian akses serentak dalam pembangunan C#

Oct 08, 2023 am 09:55 AM
Penyelesaian Penyegerakan benang akses serentak

Cara menangani penyegerakan benang dan isu dan penyelesaian akses serentak dalam pembangunan C#

Cara menangani penyegerakan benang dan isu dan penyelesaian akses serentak dalam pembangunan C#

Dengan pembangunan sistem dan pemproses komputer, populariti pemproses berbilang teras menjadikan pengkomputeran selari dan pengaturcaraan berbilang benang sangat penting. Dalam pembangunan C#, penyegerakan benang dan isu akses serentak merupakan cabaran yang sering kita hadapi. Kegagalan untuk mengendalikan isu ini dengan betul boleh membawa kepada akibat yang serius seperti perlumbaan data (Perlumbaan Data), kebuntuan (Kebuntuan) dan pertikaian sumber (Pertikaian Sumber). Oleh itu, artikel ini akan membincangkan cara menangani penyegerakan benang dan isu akses serentak dalam pembangunan C#, serta penyelesaian yang sepadan, dan melampirkan contoh kod tertentu.

  1. Masalah penyegerakan benang

Dalam pengaturcaraan berbilang benang, penyegerakan benang merujuk kepada proses penyelarasan operasi antara berbilang benang dalam susunan tertentu. Apabila berbilang benang mengakses sumber yang dikongsi pada masa yang sama, ketidakkonsistenan data atau hasil lain yang tidak dijangka mungkin berlaku jika penyegerakan yang betul tidak dilakukan. Untuk masalah penyegerakan benang, berikut ialah penyelesaian biasa:

1.1. Kunci Mutex

Kunci mutex (Mutex) ialah binaan penyegerakan yang menyediakan mekanisme yang membenarkan hanya satu utas mengakses sumber yang dikongsi pada masa yang sama . Dalam C#, anda boleh menggunakan kata kunci lock untuk melaksanakan kunci mutex. Berikut ialah contoh kod untuk kunci mutex: lock关键字来实现互斥锁。下面是一个互斥锁的示例代码:

class Program
{
    private static object lockObj = new object();
    private static int counter = 0;

    static void Main(string[] args)
    {
        Thread t1 = new Thread(IncrementCounter);
        Thread t2 = new Thread(IncrementCounter);

        t1.Start();
        t2.Start();

        t1.Join();
        t2.Join();

        Console.WriteLine("Counter: " + counter);
    }

    static void IncrementCounter()
    {
        for (int i = 0; i < 100000; i++)
        {
            lock (lockObj)
            {
                counter++;
            }
        }
    }
}
Salin selepas log masuk

在上面的示例中,我们创建了两个线程t1t2,它们执行的都是IncrementCounter方法。通过lock (lockObj)来锁定共享资源counter,确保只有一个线程能够访问它。最后输出的Counter的值应为200000

1.2. 信号量

信号量(Semaphore)是一种同步构造,它用于控制对共享资源的访问数量。信号量可以用来实现对资源的不同程度的限制,允许多个线程同时访问资源。在C#中,可以使用Semaphore类来实现信号量。下面是一个信号量的示例代码:

class Program
{
    private static Semaphore semaphore = new Semaphore(2, 2);
    private static int counter = 0;

    static void Main(string[] args)
    {
        Thread t1 = new Thread(IncrementCounter);
        Thread t2 = new Thread(IncrementCounter);
        Thread t3 = new Thread(IncrementCounter);

        t1.Start();
        t2.Start();
        t3.Start();

        t1.Join();
        t2.Join();
        t3.Join();

        Console.WriteLine("Counter: " + counter);
    }

    static void IncrementCounter()
    {
        semaphore.WaitOne();

        for (int i = 0; i < 100000; i++)
        {
            counter++;
        }

        semaphore.Release();
    }
}
Salin selepas log masuk

在上面的示例中,我们创建了一个含有两个许可证的信号量semaphore,它允许最多两个线程同时访问共享资源。如果信号量的许可证数已经达到上限,则后续的线程需要等待其他线程释放许可证。最后输出的Counter的值应为300000

  1. 并发访问问题

并发访问是指多个线程同时访问共享资源的情况。当多个线程同时读取和写入同一内存位置时,可能会产生不确定的结果。为了避免并发访问问题,以下是常见的解决方法:

2.1. 读写锁

读写锁(Reader-Writer Lock)是一种同步构造,它允许多个线程同时读取共享资源,但只允许一个线程写入共享资源。在C#中,可以使用ReaderWriterLockSlim类来实现读写锁。下面是一个读写锁的示例代码:

class Program
{
    private static ReaderWriterLockSlim rwLock = new ReaderWriterLockSlim();
    private static int counter = 0;

    static void Main(string[] args)
    {
        Thread t1 = new Thread(ReadCounter);
        Thread t2 = new Thread(ReadCounter);
        Thread t3 = new Thread(WriteCounter);

        t1.Start();
        t2.Start();
        t3.Start();

        t1.Join();
        t2.Join();
        t3.Join();

        Console.WriteLine("Counter: " + counter);
    }

    static void ReadCounter()
    {
        rwLock.EnterReadLock();

        Console.WriteLine("Counter: " + counter);

        rwLock.ExitReadLock();
    }

    static void WriteCounter()
    {
        rwLock.EnterWriteLock();

        counter++;

        rwLock.ExitWriteLock();
    }
}
Salin selepas log masuk

在上面的示例中,我们创建了两个读线程t1t2以及一个写线程t3。通过rwLock.EnterReadLock()rwLock.EnterWriteLock()来锁定共享资源counter,确保只有一个线程能够进行写操作,但允许多个线程进行读操作。最后输出的Counter的值应为1

2.2. 并发集合

在C#中,为了方便处理并发访问问题,提供了一系列的并发集合类。这些类可以在多线程环境中安全地进行读取和写入操作,从而避免了对共享资源的直接访问问题。具体的并发集合类包括ConcurrentQueueConcurrentStackConcurrentBagConcurrentDictionary等。以下是一个并发队列的示例代码:

class Program
{
    private static ConcurrentQueue<int> queue = new ConcurrentQueue<int>();

    static void Main(string[] args)
    {
        Thread t1 = new Thread(EnqueueItems);
        Thread t2 = new Thread(DequeueItems);

        t1.Start();
        t2.Start();

        t1.Join();
        t2.Join();
    }

    static void EnqueueItems()
    {
        for (int i = 0; i < 100; i++)
        {
            queue.Enqueue(i);
            Console.WriteLine("Enqueued: " + i);
            Thread.Sleep(100);
        }
    }

    static void DequeueItems()
    {
        int item;

        while (true)
        {
            if (queue.TryDequeue(out item))
            {
                Console.WriteLine("Dequeued: " + item);
            }
            else
            {
                Thread.Sleep(100);
            }
        }
    }
}
Salin selepas log masuk

在上面的示例中,我们使用ConcurrentQueue类实现了一个并发队列。线程t1往队列中不断添加元素,线程t2从队列中不断取出元素。由于ConcurrentQueuerrreee

Dalam contoh di atas, kami mencipta dua urutan t1 dan t2, yang kedua-duanya melaksanakan IncrementCounter kaedah. Gunakan <code>lock (lockObj) untuk mengunci sumber kongsi counter untuk memastikan hanya satu urutan boleh mengaksesnya. Nilai output akhir Counter hendaklah 200000.

1.2. Semaphore

Semaphore ialah binaan penyegerakan yang digunakan untuk mengawal bilangan akses kepada sumber yang dikongsi. Semaphore boleh digunakan untuk melaksanakan pelbagai peringkat sekatan ke atas sumber, membenarkan berbilang benang mengakses sumber pada masa yang sama. Dalam C#, anda boleh menggunakan kelas Semaphore untuk melaksanakan semaphore. Berikut ialah contoh kod untuk semaphore: 🎜rrreee🎜Dalam contoh di atas, kami mencipta semaphore semaphore dengan dua lesen, yang membenarkan sehingga dua urutan mengakses sumber yang dikongsi secara serentak. Jika bilangan lesen semaphore telah mencapai had atas, urutan berikutnya perlu menunggu urutan lain untuk mengeluarkan lesen. Nilai output akhir Counter hendaklah 300000. 🎜
    🎜Masalah akses serentak🎜🎜🎜Akses serentak merujuk kepada situasi di mana berbilang rangkaian mengakses sumber kongsi pada masa yang sama. Apabila berbilang benang membaca dan menulis ke lokasi ingatan yang sama secara serentak, keputusan tidak tentu mungkin berlaku. Untuk mengelakkan masalah akses serentak, berikut ialah penyelesaian biasa: 🎜🎜2.1. Kunci Baca-Penulis 🎜🎜Kunci Pembaca-Penulis (Kunci Pembaca-Penulis) ialah binaan penyegerakan yang membenarkan berbilang urutan membaca sumber yang dikongsi pada masa yang sama, tetapi hanya Membenarkan urutan menulis kepada sumber yang dikongsi. Dalam C#, anda boleh menggunakan kelas ReaderWriterLockSlim untuk melaksanakan kunci baca-tulis. Berikut ialah contoh kod untuk kunci baca-tulis: 🎜rrreee🎜Dalam contoh di atas, kami mencipta dua utas bacaan t1 dan t2 dan satu utas penulisan t3. Kunci counter sumber yang dikongsi melalui rwLock.EnterReadLock() dan rwLock.EnterWriteLock() untuk memastikan hanya satu urutan boleh melakukan operasi tulis, tetapi benarkan Berbilang benang melakukan operasi baca. Nilai output akhir Counter hendaklah 1. 🎜🎜2.2. Koleksi Serentak🎜🎜Dalam C#, untuk memudahkan pengendalian isu akses serentak, satu siri kelas pengumpulan serentak disediakan. Kelas ini boleh melaksanakan operasi baca dan tulis dengan selamat dalam persekitaran berbilang benang, sekali gus mengelakkan masalah akses terus kepada sumber yang dikongsi. Kelas pengumpulan serentak yang khusus termasuk ConcurrentQueue, ConcurrentStack, ConcurrentBag, ConcurrentDictionary, dsb. Berikut ialah contoh kod untuk baris gilir serentak: 🎜rrreee🎜Dalam contoh di atas, kami melaksanakan baris gilir serentak menggunakan kelas ConcurrentQueue. Benang t1 menambahkan elemen pada baris gilir secara berterusan dan benang t2 secara berterusan mengalih keluar elemen daripada baris gilir. Memandangkan kelas ConcurrentQueue menyediakan mekanisme penyegerakan dalaman, tiada operasi penguncian tambahan diperlukan untuk memastikan keselamatan serentak. Unsur-unsur yang dikeluarkan oleh setiap gelung mungkin saling berkait, yang disebabkan oleh berbilang benang membaca dan menulis baris gilir pada masa yang sama. 🎜🎜Ringkasan🎜🎜Dalam pembangunan C#, penyegerakan benang dan isu akses serentak ialah perkara yang perlu kita fokuskan. Untuk menyelesaikan masalah ini, artikel ini membincangkan penyelesaian biasa, termasuk mutex, semaphore, kunci baca-tulis dan koleksi serentak. Dalam pembangunan sebenar, kita perlu memilih mekanisme penyegerakan yang sesuai dan koleksi konkurensi mengikut situasi tertentu untuk memastikan ketepatan dan prestasi program berbilang benang. 🎜

    Saya berharap melalui pengenalan dan contoh kod artikel ini, pembaca dapat memahami dengan lebih baik kaedah menangani penyegerakan benang dan isu akses serentak dalam pembangunan C#, dan menerapkannya dalam amalan. Ia juga penting bagi pembangun mempertimbangkan dengan teliti interaksi antara utas apabila melakukan pengaturcaraan berbilang benang untuk mengelakkan keadaan perlumbaan yang berpotensi dan masalah lain, dengan itu meningkatkan kebolehpercayaan dan prestasi program.

Atas ialah kandungan terperinci Cara menangani penyegerakan benang dan isu dan penyelesaian akses serentak dalam pembangunan C#. 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)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
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)

Apakah sebab mengapa PS terus menunjukkan pemuatan? Apakah sebab mengapa PS terus menunjukkan pemuatan? Apr 06, 2025 pm 06:39 PM

PS "Memuatkan" Masalah disebabkan oleh akses sumber atau masalah pemprosesan: Kelajuan bacaan cakera keras adalah perlahan atau buruk: Gunakan CrystaldiskInfo untuk memeriksa kesihatan cakera keras dan menggantikan cakera keras yang bermasalah. Memori yang tidak mencukupi: Meningkatkan memori untuk memenuhi keperluan PS untuk imej resolusi tinggi dan pemprosesan lapisan kompleks. Pemandu kad grafik sudah lapuk atau rosak: Kemas kini pemandu untuk mengoptimumkan komunikasi antara PS dan kad grafik. Laluan fail terlalu panjang atau nama fail mempunyai aksara khas: Gunakan laluan pendek dan elakkan aksara khas. Masalah PS sendiri: Pasang semula atau membaiki pemasang PS.

Apakah soalan umum mengenai mengeksport PDF di PS Apakah soalan umum mengenai mengeksport PDF di PS Apr 06, 2025 pm 04:51 PM

Soalan dan penyelesaian yang sering ditanya Apabila mengeksport PS sebagai PDF: Font Embedding Masalah: Periksa pilihan "Font", pilih "Benamkan" atau tukar fon ke dalam lengkung (laluan). Masalah Penyimpangan Warna: Tukar fail ke dalam mod CMYK dan laraskan warna; Secara langsung mengeksportnya dengan RGB memerlukan persediaan psikologi untuk pratonton dan sisihan warna. Isu Resolusi dan Saiz Fail: Pilih resolusi mengikut keadaan sebenar, atau gunakan pilihan mampatan untuk mengoptimumkan saiz fail. Isu Kesan Khas: Gabungan (meratakan) lapisan sebelum mengeksport, atau menimbang kebaikan dan keburukan.

Bagaimana menyelesaikan masalah pemuatan apabila PS dimulakan? Bagaimana menyelesaikan masalah pemuatan apabila PS dimulakan? Apr 06, 2025 pm 06:36 PM

PS yang tersangkut pada "memuatkan" apabila boot boleh disebabkan oleh pelbagai sebab: Lumpuhkan plugin yang korup atau bercanggah. Padam atau namakan semula fail konfigurasi yang rosak. Tutup program yang tidak perlu atau menaik taraf memori untuk mengelakkan memori yang tidak mencukupi. Naik taraf ke pemacu keadaan pepejal untuk mempercepatkan bacaan cakera keras. Pasang semula PS untuk membaiki fail sistem rasuah atau isu pakej pemasangan. Lihat maklumat ralat semasa proses permulaan analisis log ralat.

Bagaimana cara mengeluarkan gaya lalai dalam senarai bootstrap? Bagaimana cara mengeluarkan gaya lalai dalam senarai bootstrap? Apr 07, 2025 am 10:18 AM

Gaya lalai senarai bootstrap boleh dikeluarkan dengan mengatasi CSS. Gunakan peraturan dan pemilih CSS yang lebih spesifik, ikuti "Prinsip Jarak" dan "Prinsip Berat", mengatasi gaya lalai bootstrap. Untuk mengelakkan konflik gaya, lebih banyak pemilih yang disasarkan boleh digunakan. Sekiranya penindasan tidak berjaya, laraskan berat CSS adat. Pada masa yang sama, perhatikan pengoptimuman prestasi, elakkan terlalu banyak! Penting, dan tulis kod CSS ringkas dan cekap.

Proses pengeluaran halaman H5 Proses pengeluaran halaman H5 Apr 06, 2025 am 09:03 AM

H5 Page Proses Proses: Reka Bentuk: Rancangan Layout Halaman, Gaya dan Kandungan; Pembinaan Struktur HTML: Gunakan tag HTML untuk membina rangka kerja halaman; Penulisan Gaya CSS: Gunakan CSS untuk mengawal penampilan dan susun atur halaman; Pelaksanaan interaksi JavaScript: Tulis kod untuk mencapai animasi dan interaksi halaman; Pengoptimuman Prestasi: Memampatkan gambar, kod dan mengurangkan permintaan HTTP untuk meningkatkan kelajuan pemuatan halaman.

Adakah imej berpusat imej mengezum imej? Adakah imej berpusat imej mengezum imej? Apr 07, 2025 am 07:42 AM

Cara Mencapai Pusat Imej dan Penskalaan di Bootstrap: Gunakan D-Flex Justify-Content-Center untuk memusatkan imej secara mendatar. Gunakan Align-item-center dan ketinggian elemen induk tetap secara menegak memusatkan imej. Gunakan atribut lebar dan ketinggian untuk mengawal saiz imej, atau gunakan ketinggian maksimum dan ketinggian max untuk mengehadkan saiz maksimum. Gunakan kelas IMG-cecair atau mekanisme reka bentuk responsif, seperti pertanyaan media, untuk mencapai skala responsif. Mengoptimumkan saiz imej, mengawal pengukuran menggunakan atribut yang sesuai dengan objek, dan ikuti amalan terbaik untuk memastikan prestasi dan penyelenggaraan.

Cara menggunakan lalai eksport di Vue Cara menggunakan lalai eksport di Vue Apr 07, 2025 pm 07:21 PM

Eksport Lalai di Vue mendedahkan: Eksport lalai, mengimport keseluruhan modul pada satu masa, tanpa menentukan nama. Komponen ditukar menjadi modul pada masa kompilasi, dan modul yang tersedia dibungkus melalui alat binaan. Ia boleh digabungkan dengan eksport yang dinamakan dan mengeksport kandungan lain, seperti pemalar atau fungsi. Soalan -soalan yang sering ditanya termasuk kebergantungan bulat, kesilapan laluan, dan membina kesilapan, yang memerlukan pemeriksaan yang teliti terhadap kod dan penyataan import. Amalan terbaik termasuk segmentasi kod, kebolehbacaan, dan penggunaan semula komponen.

Apa yang Perlu Dilakukan Sekiranya Jadual Bootstrap Menggunakan Ajax untuk mendapatkan data yang dihiasi Apa yang Perlu Dilakukan Sekiranya Jadual Bootstrap Menggunakan Ajax untuk mendapatkan data yang dihiasi Apr 07, 2025 am 11:54 AM

Penyelesaian ke Jadual Bootstrap Kod Garbled Apabila menggunakan AJAX untuk mendapatkan data dari pelayan: 1. Tetapkan pengekodan aksara yang betul dari kod pelayan (seperti UTF-8). 2. Tetapkan tajuk Permintaan dalam permintaan AJAX dan tentukan pengekodan aksara yang diterima (terima-charset). 3. Gunakan penukar "Unescape" jadual bootstrap untuk menyahkod entiti HTML yang melarikan diri ke dalam aksara asal.

See all articles