Apakah mekanisme kerjasama fungsi C++ dalam pengaturcaraan serentak?

WBOY
Lepaskan: 2024-04-28 08:33:01
asal
279 orang telah melayarinya

C++ pengaturcaraan serentak menyediakan mekanisme kerjasama, termasuk muteks, pembolehubah keadaan, semaphore dan pembolehubah atom, untuk menyelaraskan interaksi benang dan mencegah konflik dan kebuntuan. Mekanisme ini termasuk: Mutexes: Lindungi sumber yang dikongsi, memastikan akses hanya dengan satu utas pada satu masa. Pembolehubah keadaan: Membenarkan urutan menunggu untuk syarat dipenuhi dan dimaklumkan. Semaphore: Hadkan bilangan utas yang boleh mengakses sumber yang dikongsi pada masa yang sama. Pembolehubah atom: Pastikan operasi atom pada pembolehubah yang dikongsi dan mengelakkan persaingan data.

C++ 函数在并发编程中有哪些协作机制?

Mekanisme kolaborasi fungsi C++ dalam pengaturcaraan serentak

Dalam pengaturcaraan serentak, mekanisme kerjasama membolehkan pelbagai fungsi berfungsi bersama tanpa konflik atau kebuntuan. C++ menyediakan pelbagai mekanisme kerjasama yang direka untuk meningkatkan skalabiliti dan kecekapan aplikasi serentak.

Mutex (Mutex)

Mutex ialah pembolehubah yang melindungi sumber kongsi daripada akses serentak. Ia memastikan bahawa hanya satu utas boleh mengakses sumber yang dilindungi dengan memperoleh dan melepaskan kunci.

std::mutex m;

void thread_function() {
  // 获得互斥量锁
  m.lock();

  // 访问共享资源

  // 释放互斥量锁
  m.unlock();
}
Salin selepas log masuk

Condition Variable

Condition variable digunakan untuk menunggu syarat tertentu dipenuhi. Ia boleh memberitahu urutan menunggu melalui fungsi wait() 函数等待条件变为真,也可以通过 notify_one()notify_all().

std::condition_variable cv;
std::mutex m;
bool condition_met = false;

void waiting_thread_function() {
  std::unique_lock<std::mutex> lock(m);
  while (!condition_met) {
    cv.wait(lock);
  }
}

void signalling_thread_function() {
  std::lock_guard<std::mutex> lock(m);
  condition_met = true;

  // 通知等待的线程
  cv.notify_all();
}
Salin selepas log masuk

Semaphore (Semaphore)

Semaphore digunakan untuk mengehadkan bilangan utas yang boleh mengakses sumber yang dikongsi pada masa yang sama. Ia dilaksanakan melalui kaunter yang mewakili bilangan utas yang boleh mengakses sumber secara serentak.

std::counting_semaphore<int> semaphore(2);

void thread_function() {
  // 获取许可证,允许访问资源
  semaphore.acquire();

  // 访问共享资源

  // 释放许可证
  semaphore.release();
}
Salin selepas log masuk

Pembolehubah Atom

Pembolehubah atom ialah jenis pembolehubah khas yang menjamin akses atom kepada pembolehubah yang dikongsi. Ia menggunakan arahan perkakasan khusus untuk memastikan bahawa operasi baca dan tulis pembolehubah tidak boleh dibahagikan, dengan itu menghalang perlumbaan data.

std::atomic<int> counter = 0;

void thread_function() {
  // 原子增加计数器
  counter.fetch_add(1);
}
Salin selepas log masuk

Kes praktikal: masalah pengeluar-pengguna

Masalah pengeluar-pengguna ialah masalah klasik dalam pengaturcaraan serentak, melibatkan benang pengeluar dan benang pengguna. Benang pengeluar menghasilkan dan memasukkan elemen ke dalam baris gilir yang dikongsi, manakala utas pengguna mengalih keluar elemen daripada baris gilir dan memakannya.

Menggunakan mekanisme kerjasama di atas, kami boleh menyelesaikan masalah ini dengan selamat dan boleh dipercayai:

  • Gunakan mutex untuk melindungi baris gilir daripada akses serentak.
  • Gunakan pembolehubah keadaan untuk memberitahu pengguna bahawa elemen baharu berada dalam baris gilir.
  • Gunakan semaphore untuk mengehadkan bilangan utas pengguna yang boleh menggunakan elemen pada masa yang sama.

Dengan menggabungkan mekanisme kerjasama ini, kami boleh mencipta pelaksanaan pengeluar-pengguna yang cekap dan bebas kunci.

Atas ialah kandungan terperinci Apakah mekanisme kerjasama fungsi C++ dalam pengaturcaraan serentak?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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