Bagaimana untuk menyelesaikan masalah kebuntuan biasa dalam pengaturcaraan berbilang benang C++? Teknik untuk mengelakkan kebuntuan: Susunan kunci: Sentiasa dapatkan kunci dalam susunan yang sama. Pengesanan jalan buntu: Gunakan algoritma untuk mengesan dan menyelesaikan kebuntuan. Tamat masa: Tetapkan nilai tamat masa untuk kunci untuk mengelakkan benang menunggu selama-lamanya. Penyongsangan keutamaan: Tetapkan keutamaan yang berbeza untuk mengurangkan kemungkinan kebuntuan.
Kebuntuan ialah ralat pengaturcaraan di mana dua atau lebih utas disekat selama-lamanya, menunggu satu sama lain melepaskan kunci. Ini biasanya disebabkan oleh kunci bergantung kitaran, di mana satu benang memegang kunci A dan menunggu kunci B, manakala satu lagi benang memegang kunci B dan menunggu kunci A.
Berikut adalah teknik biasa untuk mengelakkan kebuntuan:
Mari kita ambil contoh kod berikut di mana dua utas cuba mengakses sumber yang dikongsi:
class Resource { public: void increment() { std::lock_guard<std::mutex> lock(m_mutex); ++m_value; } int m_value = 0; std::mutex m_mutex; }; int main() { Resource resource; std::thread thread1([&resource] { resource.increment(); }); std::thread thread2([&resource] { resource.increment(); }); thread1.join(); thread2.join(); }
Dalam contoh ini, utas 1 dan 2 cuba memperoleh kunci yang sama (resource.m_mutex< /code >) untuk mengemas kini pembolehubah <code>m_value
. Jika benang 1 memperoleh kunci terlebih dahulu, benang 2 akan disekat, dan sebaliknya. Ini boleh menyebabkan kebergantungan bulat dan kebuntuan. resource.m_mutex
) 来更新 m_value
变量。如果线程 1 先获取锁,则线程 2 将被阻止,反之亦然。这可能会导致循环依赖和死锁。
为了修复此问题,我们可以使用加锁顺序。例如,我们可以让所有线程先获取 resource.m_mutex
锁,再获取 m_value
resource.m_mutex
dahulu, dan kemudian memperoleh kunci m_value
: 🎜class Resource { public: void increment() { std::lock(m_mutex, m_value_mutex); ++m_value; std::unlock(m_value_mutex, m_mutex); } int m_value = 0; std::mutex m_mutex; std::mutex m_value_mutex; }; int main() { Resource resource; std::thread thread1([&resource] { resource.increment(); }); std::thread thread2([&resource] { resource.increment(); }); thread1.join(); thread2.join(); }
Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan masalah kebuntuan biasa dalam pengaturcaraan berbilang benang C++?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!