Mekanisme pencegahan kebuntuan berbilang benang termasuk: 1. Urutan kunci; 2. Uji dan sediakan. Mekanisme pengesanan termasuk: 1. Tamat masa; 2. Pengesan jalan buntu. Artikel tersebut mengambil contoh akaun bank yang dikongsi dan mengelakkan kebuntuan melalui urutan kunci Fungsi pindahan mula-mula meminta kunci akaun pindahan keluar dan kemudian pindahan dalam akaun.
Mekanisme pencegahan dan pengesanan jalan buntu dalam pengaturcaraan berbilang benang C++
Dalam persekitaran berbilang benang, kebuntuan ialah ralat biasa yang mungkin menyebabkan atur cara berhenti bertindak balas. Kebuntuan berlaku apabila beberapa utas menunggu selama-lamanya untuk satu sama lain melepaskan kunci mereka, mewujudkan gelung menunggu.
Untuk mengelak dan mengesan kebuntuan, C++ menyediakan beberapa mekanisme:
Mekanisme pencegahan
std::atomic_flag
dsb. yang disediakan oleh pustaka std::atomic
, semak sama ada kunci telah diminta dan kemudian tetapkannya dengan segera. . std::atomic
库提供的 std::atomic_flag
等测试并设置变量,检查锁是否已请求,然后立即设置它。检测机制
实战案例:
考虑以下共享银行账户示例:
class BankAccount { private: std::mutex m_; int balance_; public: void deposit(int amount) { std::lock_guard<std::mutex> lock(m_); balance_ += amount; } bool withdraw(int amount) { std::lock_guard<std::mutex> lock(m_); if (balance_ >= amount) { balance_ -= amount; return true; } return false; } };
避免死锁的方法是使用锁顺序:先请求 deposit()
锁,然后再请求 withdraw()
Deadlock Detector:
Gunakan perpustakaan pihak ketiga seperti Boost.Thread untuk memantau aktiviti thread, mengesan kebuntuan dan mengambil tindakan yang perlu. . kemudian minta ia sekali lagi kunciwithdraw()
. 🎜void transfer(BankAccount& from, BankAccount& to, int amount) { std::lock_guard<std::mutex> fromLock(from.m_); std::lock_guard<std::mutex> toLock(to.m_); if (from.withdraw(amount)) { to.deposit(amount); } }
Atas ialah kandungan terperinci Mekanisme pencegahan dan pengesanan kebuntuan dalam pengaturcaraan berbilang benang C++. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!