Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk melaksanakan kawalan konkurensi dalam pengaturcaraan berbilang benang?

Bagaimana untuk melaksanakan kawalan konkurensi dalam pengaturcaraan berbilang benang?

PHPz
PHPzasal
2023-08-27 09:27:33691semak imbas

Bagaimana untuk melaksanakan kawalan konkurensi dalam pengaturcaraan berbilang benang?

Bagaimana untuk melaksanakan kawalan konkurensi dalam pengaturcaraan berbilang benang?

Dengan perkembangan teknologi komputer, pengaturcaraan berbilang benang telah menjadi bahagian yang amat diperlukan dalam pembangunan perisian moden. Pengaturcaraan berbilang benang boleh meningkatkan prestasi dan responsif program, tetapi ia juga membawa masalah dengan kawalan serentak. Dalam persekitaran berbilang benang, berbilang utas yang mengakses sumber dikongsi pada masa yang sama boleh menyebabkan persaingan data dan ralat operasi. Oleh itu, mencapai kawalan serentak yang berkesan adalah bahagian penting dalam memastikan pelaksanaan program yang betul.

Dalam proses melaksanakan kawalan konkurensi dalam pengaturcaraan berbilang benang, kami biasanya menggunakan teknologi biasa berikut:

  1. Mutex (Mutex): Mutex ialah salah satu mekanisme kawalan konkurensi yang paling mudah dan paling biasa digunakan. Ia mengehadkan hanya satu utas untuk mengakses sumber pada masa yang sama dengan mengunci sumber yang dikongsi. Dalam C++, kunci mutex boleh dilaksanakan melalui std::mutex. Berikut ialah kod contoh kunci mutex mudah:
#include <iostream>
#include <mutex>
#include <thread>

std::mutex mtx;

void printHello(int threadNum) {
    mtx.lock();
    std::cout << "Hello from thread " << threadNum << "!" << std::endl;
    mtx.unlock();
}

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

Dalam kod di atas, kami mencipta dua utas dan memanggil fungsi printHello untuk mengeluarkan nombor utas. Memandangkan mutex mtx dikunci di dalam fungsi printHello, hanya satu utas boleh mengakses std::cout pada bila-bila masa, mengelakkan hasil keluaran yang mengelirukan.

  1. Pembolehubah Keadaan: Pembolehubah keadaan ialah mekanisme yang digunakan untuk penyegerakan benang dalam pengaturcaraan berbilang benang Ia membolehkan benang menunggu sehingga syarat tertentu dipenuhi dan dibangkitkan selepas syarat dipenuhi. Dalam C++, pembolehubah keadaan boleh dilaksanakan melalui std::condition_variable. Berikut ialah kod sampel untuk pembolehubah keadaan:
#include <iostream>
#include <condition_variable>
#include <mutex>
#include <thread>

std::mutex mtx;
std::condition_variable cv;
bool ready = false;

void printHello(int threadNum) {
    std::unique_lock<std::mutex> lock(mtx);
    cv.wait(lock, [] { return ready; });
    std::cout << "Hello from thread " << threadNum << "!" << std::endl;
}

int main() {
    std::thread t1(printHello, 1);
    std::thread t2(printHello, 2);
    
    std::this_thread::sleep_for(std::chrono::seconds(2));
    
    {
        std::lock_guard<std::mutex> lock(mtx);
        ready = true;
    }
    cv.notify_all();
    
    t1.join();
    t2.join();
    
    return 0;
}

Dalam kod di atas, kami mencipta dua utas dan memanggil fungsi printHello untuk mengeluarkan nombor utas. Dalam keadaan awal, pembolehubah sedia adalah palsu, jadi dua utas menunggu pada pembolehubah syarat cv. Apabila kami menetapkan sedia kepada benar dalam fungsi utama, kami memberitahu utas menunggu melalui cv.notify_all(), dan kedua-dua utas itu dibangkitkan dan mengeluarkan hasilnya masing-masing.

  1. Kendalian Atom: Operasi atom ialah operasi tanpa gangguan Menggunakan operasi atom dalam persekitaran berbilang benang boleh mengelakkan persaingan data. Dalam C++, operasi atom boleh dilaksanakan melalui std::atomic. Berikut ialah kod sampel untuk operasi atom:
#include <iostream>
#include <atomic>
#include <thread>

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

void increment() {
    for (int i = 0; i < 100000; i++) {
        counter.fetch_add(1, std::memory_order_relaxed);
    }
}

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

Dalam kod di atas, kami mencipta dua urutan untuk melaksanakan 100,000 operasi penambahan atom pada kaunter. Memandangkan operasi atom tidak terganggu, akses serentak ke kaunter tidak menyebabkan perlumbaan data.

Melalui teknologi kawalan konkurensi biasa seperti kunci mutex, pembolehubah keadaan dan operasi atom, kami boleh mencapai kawalan serentak yang berkesan dalam pengaturcaraan berbilang benang dan memastikan pelaksanaan program yang betul.

Ringkasnya, apabila melaksanakan kawalan serentak dalam pengaturcaraan berbilang benang, anda perlu memberi perhatian kepada perkara berikut: Pertama, elakkan persaingan data dan ralat operasi, dan gunakan teknologi kawalan serentak yang sesuai. Kedua, mekanisme penyegerakan mesti direka bentuk secara munasabah untuk mengelakkan masalah seperti kebuntuan dan kebuluran. Akhir sekali, prestasi kawalan konkurensi perlu diuji dan ditala untuk memastikan pelaksanaan program yang cekap.

Melalui pembelajaran dan amalan berterusan, penerapan kawalan konkurensi dalam pengaturcaraan berbilang benang akan menjadi lebih mahir dan fleksibel, dan kami boleh menulis program berbilang benang yang lebih selamat dan cekap.

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan kawalan konkurensi dalam pengaturcaraan berbilang benang?. 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