Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menyelesaikan isu persaingan berbilang benang dalam pembangunan C++

Bagaimana untuk menyelesaikan isu persaingan berbilang benang dalam pembangunan C++

WBOY
WBOYasal
2023-08-22 10:34:511453semak imbas

Bagaimana untuk menyelesaikan masalah persaingan berbilang benang dalam pembangunan C++

Dalam pembangunan C++, masalah persaingan berbilang benang adalah kawasan biasa dan terdedah kepada ralat. Disebabkan oleh pelaksanaan serentak berbilang rangkaian, apabila berbilang rangkaian mengakses sumber yang dikongsi pada masa yang sama, keadaan perlumbaan mungkin berlaku, menyebabkan program berjalan dengan keputusan yang tidak menentu. Artikel ini akan memperkenalkan beberapa kaedah dan teknik untuk menyelesaikan masalah persaingan berbilang benang dalam pembangunan C++.

1. Mekanisme Mengunci

Cara paling biasa dan asas untuk menyelesaikan persaingan berbilang benang ialah menggunakan kunci. Dengan kunci, kami memastikan bahawa hanya satu utas boleh mengakses sumber yang dikongsi. Pustaka standard C++ menyediakan pelbagai pelaksanaan kunci, seperti mutex, kunci baca/tulis, pembolehubah keadaan, dsb.

Kunci Mutex ialah kunci yang paling biasa digunakan, yang boleh memastikan bahawa hanya satu utas boleh mengakses sumber yang dilindungi pada masa yang sama. Dalam C++, kita boleh menggunakan std::mutex dan std::lock_guard untuk melaksanakan kunci mutex. Contohnya:

#include <iostream>
#include <mutex>

std::mutex mtx;

void printMessage(const std::string& message) {
    std::lock_guard<std::mutex> lock(mtx);
    std::cout << message << std::endl;
}

int main() {
    std::thread t1(printMessage, "Hello");
    std::thread t2(printMessage, "World");
    
    t1.join();
    t2.join();
    
    return 0;
}

Dalam kod di atas, kami menggunakan kunci mutex untuk melindungi pernyataan output dalam fungsi printMessage untuk memastikan tiada kekeliruan output.

Selain kunci mutex, kunci baca-tulis juga merupakan mekanisme kunci yang biasa digunakan. Ia membenarkan berbilang rangkaian untuk mengakses sumber yang dikongsi secara serentak, memerlukan pengecualian bersama hanya untuk operasi tulis. Pustaka standard C++ menyediakan std::shared_mutex untuk melaksanakan kunci baca-tulis.

2. Gunakan operasi atom

Satu lagi cara untuk menyelesaikan masalah persaingan berbilang benang ialah menggunakan operasi atom. Operasi atom ialah operasi tanpa gangguan yang boleh memastikan ketekalan sumber yang dikongsi dalam persekitaran berbilang benang. Pustaka standard C++ menyediakan kelas templat std::atomic untuk melaksanakan operasi atom.

Sebagai contoh, kita boleh menggunakan std::atomic untuk melaksanakan pembilang selamat berbilang benang:

#include <iostream>
#include <atomic>
#include <thread>

std::atomic<int> counter(0);

void incrementCounter(int num) {
    for (int i = 0; i < num; ++i) {
        ++counter;
    }
}

int main() {
    std::thread t1(incrementCounter, 100000);
    std::thread t2(incrementCounter, 100000);
    
    t1.join();
    t2.join();
    
    std::cout << "Counter: " << counter << std::endl;
    
    return 0;
}

Dalam kod di atas, kami menggunakan std::atomicbd43222e33876353aff11e13a7dc75f6 untuk memastikan operasi atom pembolehubah. Walaupun berbilang benang melakukan operasi kenaikan sendiri pada kaunter pada masa yang sama, tiada keadaan perlumbaan akan berlaku dan keputusan akhir adalah betul.

3. Gunakan struktur data selamat benang

Selain menggunakan kunci dan operasi atom, cara lain untuk menyelesaikan masalah persaingan berbilang benang ialah menggunakan struktur data selamat benang. Pustaka standard C++ menyediakan beberapa bekas selamat benang, seperti std::mutex dan std::lock_guard.

Sebagai contoh, kita boleh menggunakan std::shared_mutex, versi thread-safe std::vector, untuk melaksanakan operasi selamat di bawah berbilang benang:

#include <iostream>
#include <vector>
#include <shared_mutex>
#include <thread>

std::vector<int> numbers;
std::shared_mutex mtx;

void addNumber(int number) {
    std::lock_guard<std::shared_mutex> lock(mtx);
    numbers.push_back(number);
}

void printNumbers() {
    std::shared_lock<std::shared_mutex> lock(mtx);
    for (const auto& number : numbers) {
        std::cout << number << " ";
    }
    std::cout << std::endl;
}

int main() {
    std::thread t1(addNumber, 1);
    std::thread t2(addNumber, 2);
    std::thread t3(printNumbers);
    
    t1.join();
    t2.join();
    t3.join();
    
    return 0;
}

Dalam kod di atas, kami menggunakan std::shared_mutex untuk melindungi serentak akses kepada bekas nombor, memastikan berbilang benang boleh melakukan operasi memasukkan dan mencetak dengan selamat.

Ringkasan:

Masalah persaingan berbilang benang ialah tempat biasa dan terdedah kepada ralat dalam pembangunan C++. Untuk menyelesaikan masalah sedemikian, kami boleh menggunakan mekanisme penguncian, operasi atom dan struktur data selamat benang. Pemilihan kaedah yang sesuai boleh memastikan ketepatan dan kecekapan pengendalian program. Dalam pembangunan sebenar, kita harus cuba mengelak daripada berlakunya masalah persaingan berbilang benang dan menjalankan ujian dan pengesahan yang mencukupi untuk memastikan kestabilan dan kebolehpercayaan program.

Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan isu persaingan berbilang benang dalam pembangunan C++. 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