Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Kunci berbilang benang dalam C++ dan cara menggunakannya

Kunci berbilang benang dalam C++ dan cara menggunakannya

WBOY
WBOYasal
2023-08-21 23:18:211898semak imbas

Kunci berbilang benang dalam C++ dan cara menggunakannya

Apabila menulis program berbilang benang, untuk memastikan keselamatan data dan mengelakkan keadaan perlumbaan, kita perlu menggunakan kunci. Kunci ialah mekanisme penyegerakan yang membenarkan blok kod tertentu dilaksanakan oleh hanya satu utas pada masa yang sama. Dalam C++, terdapat banyak jenis kunci untuk dipilih, yang lebih biasa digunakan ialah kunci mutex, kunci baca-tulis dan pembolehubah keadaan. Artikel ini akan memperkenalkan konsep asas, penggunaan dan langkah berjaga-jaga kunci ini.

Mutex (Mutex)

Mutex sering digunakan untuk melindungi sumber yang dikongsi dan hanya membenarkan satu utas mengaksesnya pada masa yang sama. Apabila satu benang memegang kunci, benang lain yang ingin memegang kunci mesti menunggu. Apabila utas melepaskan kunci, utas lain boleh mula mengakses sumber yang dikongsi.

Dalam C++, definisi kunci mutex adalah seperti berikut:

#include <mutex>

std::mutex mutex;

Kaedah menggunakan kunci mutex biasanya seperti berikut:

// 线程1
mutex.lock();
// 访问共享资源
mutex.unlock();

// 线程2
mutex.lock();
// 访问共享资源
mutex.unlock();

Perlu diingatkan bahawa apabila menggunakan kunci mutex, anda harus sentiasa menggunakan kunci dan buka kunci, jika tidak ia boleh Menyebabkan kebuntuan. Di samping itu, anda harus mengelak daripada menduduki kunci untuk masa yang lama untuk mengelakkan menjejaskan pelaksanaan benang lain.

Kunci Pembaca-Penulis

Kunci Pembaca-Penulis ialah kunci khas yang membenarkan berbilang utas membaca sumber yang dikongsi pada masa yang sama, tetapi hanya membenarkan satu utas menulis kepada sumber yang dikongsi. Apabila utas menulis kepada sumber yang dikongsi, utas lain tidak boleh membaca atau menulis sehingga operasi tulis selesai dan utas bacaan tidak boleh meneruskan bacaan. Takrif kunci baca-tulis adalah seperti berikut:

#include <shared_mutex>

std::shared_mutex rw_mutex;

Kaedah menggunakan kunci baca-tulis adalah seperti berikut:

// 写入线程
rw_mutex.lock();
// 写入共享资源
rw_mutex.unlock();

// 读取线程
rw_mutex.lock_shared();
// 读取共享资源
rw_mutex.unlock_shared();

Perlu diingatkan bahawa apabila menggunakan kunci baca-tulis, keutamaan harus diberikan kepada benang. yang membaca sumber yang dikongsi untuk mengelakkan operasi menulis daripada menduduki kunci untuk masa yang lama.

Pembolehubah Keadaan

Pembolehubah keadaan biasanya digunakan untuk penyegerakan dan komunikasi antara benang. Ia adalah mekanisme penyegerakan berdasarkan kunci mutex yang boleh mencapai penyelarasan antara benang melalui mekanisme menunggu dan pemberitahuan.

Definasi pembolehubah keadaan adalah seperti berikut:

#include <condition_variable>

std::condition_variable cond_var;

Pembolehubah keadaan biasanya digunakan bersama-sama dengan kunci mutex Proses menunggu dan bangun adalah seperti berikut:

// 线程1
std::unique_lock<std::mutex> lock(mutex);
cond_var.wait(lock);
// 唤醒后执行的代码

// 线程2
std::unique_lock<std::mutex> lock(mutex);
// 执行唤醒操作
cond_var.notify_one();

Perlu diingatkan bahawa apabila menggunakan pembolehubah keadaan, anda mesti terlebih dahulu. kunci mereka, jika tidak, keadaan kebuntuan berlaku.

Ringkasan

Dalam pengaturcaraan berbilang benang, kunci ialah mekanisme penyegerakan yang penting. Apabila memilih kunci, anda harus mempertimbangkan ciri dan senario penggunaan kunci yang berbeza untuk memastikan keselamatan data dan penyelarasan benang dengan lebih baik. Ingat prinsip asas menggunakan kunci: kawalan berbutir dan mengelakkan kebuntuan.

Atas ialah kandungan terperinci Kunci berbilang benang dalam C++ dan cara menggunakannya. 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