Rumah > Artikel > pembangunan bahagian belakang > 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:
#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.
#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.
#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!