Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Apakah mekanisme penyegerakan benang biasa dalam pengaturcaraan berbilang benang C++?

Apakah mekanisme penyegerakan benang biasa dalam pengaturcaraan berbilang benang C++?

WBOY
WBOYasal
2024-06-03 20:13:00881semak imbas

Dalam pengaturcaraan berbilang benang C++, mekanisme penyegerakan benang adalah penting Terdapat tiga jenis utama: Mutex (Mutex): digunakan untuk melindungi akses eksklusif kepada sumber yang dikongsi. Pembolehubah Keadaan: Digunakan untuk memberitahu urutan bahawa syarat tertentu telah dipenuhi. Kunci Baca-Tulis: Membenarkan berbilang utas membaca data yang dikongsi pada masa yang sama, tetapi hanya satu utas boleh menulis pada satu masa.

C++ 多线程编程中有哪些常见的线程同步机制?

Mekanisme penyegerakan benang dalam pengaturcaraan berbilang benang C++

Dalam pengaturcaraan berbilang benang, mekanisme penyegerakan adalah penting untuk mengelakkan perlumbaan data dan memastikan keselamatan benang. Berikut ialah beberapa mekanisme penyegerakan benang biasa dalam C++:

Mutex (Mutex)

Mutex ialah mekanisme penyegerakan peringkat rendah yang digunakan untuk melindungi akses eksklusif kepada sumber yang dikongsi. Ia membenarkan hanya satu utas untuk mengakses bahagian kritikal (blok kod yang memerlukan penyegerakan) pada satu masa.

std::mutex m;

void critical_section() {
  std::lock_guard<std::mutex> lock(m);
  // 临界区代码
}

Condition Variable

Condition variable digunakan untuk memberitahu satu thread bahawa thread lain memenuhi syarat tertentu. Satu utas boleh menunggu syarat menggunakan kaedah wait(), manakala thread lain boleh mengisyaratkannya menggunakan notify_one() atau notify_all() kaedah. wait() 方法等待条件,而另一个线程可以使用 notify_one()notify_all() 方法发出信号。

std::condition_variable cv;
bool condition_met = false;

void wait_for_condition() {
  std::unique_lock<std::mutex> lock(m);
  cv.wait(lock, []() { return condition_met; });
}

void signal_condition() {
  std::lock_guard<std::mutex> lock(m);
  condition_met = true;
  cv.notify_one();
}

读写锁 (Read-Write Lock)

读写锁允许多个线程同时读取共享数据,但一次只能有一个线程写入共享数据。

std::shared_lock<std::shared_mutex> lock(m, std::shared_lock<std::shared_mutex>::defer_lock);

实战案例:共享计数器

考虑一个共享计数器,需要同时支持多个线程的增量和获取操作:

class SharedCounter {
  std::mutex mutex_;
  int count_;

public:
  void increment() {
    std::lock_guard<std::mutex> lock(mutex_);
    ++count_;
  }

  int get() {
    std::lock_guard<std::mutex> lock(mutex_);
    return count_;
  }
};

在这个例子中,mutex_ 互斥锁用于保护 count_ 变量。每个线程都可以通过 increment() 方法独立增量计数器,并且可以通过 get()rrreee

🎜Kunci Baca-Tulis (Kunci Baca-Tulis)🎜🎜🎜Kunci Baca-Tulis membenarkan berbilang urutan membaca data yang dikongsi pada masa yang sama, tetapi hanya satu utas boleh menulis data yang dikongsi pada satu-satu masa. 🎜rrreee🎜🎜Kes praktikal: Kaunter kongsi🎜🎜🎜Pertimbangkan kaunter kongsi yang perlu menyokong operasi kenaikan dan pemerolehan berbilang urutan pada masa yang sama: 🎜rreee🎜Dalam contoh ini, kunci mutex mutex_ digunakan Untuk melindungi pembolehubah count_. Setiap urutan boleh menambah pembilang secara bebas melalui kaedah increment() dan boleh membaca nilai semasa melalui kaedah get(). 🎜

Atas ialah kandungan terperinci Apakah mekanisme penyegerakan benang biasa dalam pengaturcaraan berbilang benang 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