Memikirkan std::lock_guard vs. std::scoped_lock
C 17 menandakan pengenalan kelas kunci novel, std::scoped_lock , yang berkongsi persamaan dengan std::lock_guard yang dihormati. Artikel ini menyelidiki perbezaan antara dua mekanisme penguncian ini, membimbing anda dalam memilih alat yang optimum untuk keperluan khusus anda.
Bila Menggunakan std::lock_guard
Untuk senario di mana anda memerlukan penguncian mutex tunggal untuk keseluruhan skop, std::lock_guard menawarkan API yang lebih selamat daripada std::scoped_lock. Pertimbangkan contoh berikut:
{ std::scoped_lock lock; // protect this block ... }
Coretan ini secara tidak sengaja mengakibatkan ralat masa jalan kerana ia terlibat dalam "gelagat halimunan". Ia kelihatan menyusun dengan lancar tetapi akhirnya tidak memberi kesan penguncian. Kefungsian yang dimaksudkan mungkin diperlukan:
{ std::scoped_lock lock{mut}; // protect this block ... }
Menjelaskan mutex sasaran untuk mengunci menyelesaikan isu ini. Sebaliknya, menggunakan std::lock_guard akan menghalang contoh pertama daripada menyusun, menjadikannya ralat masa kompilasi yang jelas.
Bila Menggunakan std::scoped_lock
Bila berhadapan dengan situasi di mana berbilang mutex perlu dikunci, std::scoped_lock bersinar. Contohnya:
{ std::scoped_lock(lock1, lock2); // protect this block ... }
Coretan ini secara ringkas mengunci dua mutex untuk tempoh blok.
Kesimpulan
Kedua-dua std::lock_guard dan std::scoped_lock memenuhi senario yang berbeza:
Walaupun std::scoped_lock menyediakan fungsi yang lebih komprehensif, std::lock_guard menawarkan keselamatan API yang dipertingkatkan dalam kes tertentu. Pertimbangkan keperluan kod anda dengan teliti apabila memilih pendekatan yang paling sesuai.
Atas ialah kandungan terperinci std::lock_guard vs. std::scoped_lock: Bila Memilih Yang Mana?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!