Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Pengaturcaraan serentak C++: Bagaimana untuk melaksanakan reka bentuk selamat benang bagi struktur data serentak?

Pengaturcaraan serentak C++: Bagaimana untuk melaksanakan reka bentuk selamat benang bagi struktur data serentak?

WBOY
WBOYasal
2024-05-03 17:15:01852semak imbas

Reka bentuk struktur data serentak selamat benang: Kaedah pelaksanaan: jenis atom dan mutex lock jenis atom: pastikan berbilang akses tidak boleh dibahagikan dan pastikan data konsisten. Kunci Mutex: mengehadkan akses kepada data yang dikongsi oleh satu utas pada satu masa untuk mengelakkan rasuah data serentak. Contoh: Barisan Selamat Benang menunjukkan struktur data selamat benang dilaksanakan menggunakan kunci mutex. . Dalam pengaturcaraan serentak C++, mencapai keselamatan benang adalah penting.

Jenis Atom dan Muteks Pengaturcaraan serentak C++: Bagaimana untuk melaksanakan reka bentuk selamat benang bagi struktur data serentak?

Jenis Atom:

Jenis atom memastikan berbilang akses kepada data asas tidak boleh dibahagikan untuk menjamin konsistensi. Contohnya, std::atomic<int></int> .

Kunci Mutex:

Kunci Mutex membenarkan satu utas mengakses data yang dikongsi pada satu masa, sekali gus menghalang kerosakan data yang disebabkan oleh akses serentak. Gunakan std::mutex .

Contoh: Giliran Selamat Benang
Berikut ialah baris gilir selamat benang mudah dilaksanakan menggunakan mutex: std::atomic<int></int>

互斥锁:
互斥锁允许一个线程一次访问共享数据,从而防止并发访问导致的数据损坏。使用 std::mutex

实例:线程安全队列

以下是一个使用互斥锁实现的简单的线程安全队列:

#include <iostream>
#include <mutex>
#include <queue>

class ThreadSafeQueue {
private:
    std::queue<int> data;
    std::mutex mtx;

public:
    void push(int value) {
        std::lock_guard<std::mutex> lock(mtx);
        data.push(value);
    }

    int pop() {
        std::lock_guard<std::mutex> lock(mtx);
        if (data.empty()) throw std::runtime_error("Queue is empty");
        int value = data.front();
        data.pop();
        return value;
    }

    bool empty() {
        std::lock_guard<std::mutex> lock(mtx);
        return data.empty();
    }
};

int main() {
    ThreadSafeQueue queue;

    std::thread t1([&queue] {
        for (int i = 0; i < 1000; ++i) {
            std::lock_guard<std::mutex> lock(queue.mtx);
            queue.push(i);
        }
    });

    std::thread t2([&queue] {
        while (!queue.empty()) {
            std::lock_guard<std::mutex> lock(queue.mtx);
            std::cout << "Thread 2 popped: " << queue.pop() << std::endl;
        }
    });

    t1.join();
    t2.join();

    return 0;
}

在这个示例中:

  • std::mutex 用于保护对队列数据的并发访问。
  • std::lock_guardrrreee
  • Dalam contoh ini:
    • std::mutex digunakan Lindungi serentak akses kepada data baris gilir.

    std::lock_guard digunakan untuk mengunci mutex apabila memasuki bahagian kritikal baris gilir dan membuka kuncinya apabila keluar.

    Berbilang utas boleh menolak dan meletuskan data dengan selamat ke baris gilir secara serentak.

    🎜🎜Kesimpulan🎜🎜 Melaksanakan struktur data serentak selamat benang ialah aspek penting dalam pengaturcaraan serentak dalam C++. Dengan menggunakan mekanisme seperti jenis atom dan kunci mutex, kami boleh memastikan ketekalan data dan mencegah kerosakan data atau ranap program yang disebabkan oleh akses serentak. 🎜

    Atas ialah kandungan terperinci Pengaturcaraan serentak C++: Bagaimana untuk melaksanakan reka bentuk selamat benang bagi struktur data serentak?. 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