Bagaimana untuk menguruskan sumber yang dikongsi dengan cekap dalam pengaturcaraan berbilang benang C++?

PHPz
Lepaskan: 2024-06-04 18:52:03
asal
1118 orang telah melayarinya

Dalam pengaturcaraan berbilang benang C++, pembolehubah mutex dan keadaan boleh digunakan untuk mengurus sumber dikongsi dengan cekap dan mengelakkan persaingan data dan kebuntuan: Mutex (Mutex) membenarkan hanya satu utas untuk mengakses sumber pada satu masa, memastikan integriti data. Pembolehubah keadaan (Pembolehubah Keadaan) digunakan untuk menyelaraskan kerjasama utas, membenarkan satu utas menunggu untuk utas lain melakukan tindakan tertentu. Dalam kes sebenar, utas pengeluar menambah data pada penimbal dan memberitahu pengguna Urutan pengguna menunggu pemberitahuan pengeluar dan kemudian membaca data daripada penampan Mutex dan pembolehubah keadaan memastikan akses selamat kepada sumber yang dikongsi.

C++ 多线程编程中如何高效地管理共享资源?

C++ Multi-threaded Programming: Cekap mengurus sumber kongsi

Dalam pengaturcaraan berbilang thread, kawalan akses sumber dikongsi adalah penting. Artikel ini akan menerangkan cara menggunakan primitif penyegerakan seperti mutex dan pembolehubah keadaan dalam C++ untuk mengurus sumber dikongsi dengan cekap dan mengelakkan perlumbaan data dan kebuntuan.

Mutex (Mutex)

Mutex ialah mekanisme utama untuk melindungi sumber kongsi daripada akses serentak. Ia membenarkan hanya satu utas untuk mengakses sumber pada satu masa, sekali gus memastikan integriti data.

std::mutex m;  // 创建一个互斥量

void access_resource() {
  std::lock_guard<std::mutex> lock(m);  // 加锁
  // 对共享资源执行操作
  lock.unlock();  // 解锁
}
Salin selepas log masuk

Pembolehubah Keadaan

Pembolehubah keadaan digunakan untuk menyelaraskan kerjasama benang. Ia membenarkan satu utas menunggu untuk satu lagi utas untuk melakukan tindakan tertentu.

std::condition_variable cv;  // 创建一个条件变量
std::mutex m;  // 创建一个与条件变量关联的互斥量

void produce() {
  std::unique_lock<std::mutex> lock(m);
  // 生产数据
  lock.unlock();
  cv.notify_one();  // 通知消费者生产完成
}

void consume() {
  std::unique_lock<std::mutex> lock(m);
  // 等待生产者通知
  cv.wait(lock);
  // 消费数据
  lock.unlock();
}
Salin selepas log masuk

Kes praktikal

Berikut ialah contoh mudah menggunakan pembolehubah mutex dan keadaan untuk mengurus sumber yang dikongsi. Ia menggunakan penimbal untuk menyimpan data, utas pengeluar menambah data pada penimbal, dan utas pengguna membaca data daripada penimbal.

#include <mutex>
#include <condition_variable>
#include <thread>
#include <vector>

std::mutex m;
std::condition_variable cv;

std::vector<int> buffer;  // 共享资源缓冲区

void produce() {
  while (true) {
    std::lock_guard<std::mutex> lock(m);
    buffer.push_back(rand());
    cv.notify_one();
  }
}

void consume() {
  while (true) {
    std::unique_lock<std::mutex> lock(m);
    cv.wait(lock, [] { return !buffer.empty(); });
    int data = buffer.back();
    buffer.pop_back();
  }
}

int main() {
  std::thread t1(produce);
  std::thread t2(consume);
  t1.join();
  t2.join();
  return 0;
}
Salin selepas log masuk

Dengan menggunakan pembolehubah mutex dan keadaan, kami memastikan bahawa rangkaian pengeluar dan pengguna boleh mengakses penimbal pada masa yang sama, tetapi tidak akan ada perlumbaan data.

Atas ialah kandungan terperinci Bagaimana untuk menguruskan sumber yang dikongsi dengan cekap dalam pengaturcaraan berbilang benang C++?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan