Comment résoudre les problèmes de blocage courants dans la programmation multithread C++ ? Techniques pour éviter les blocages : Ordre des verrous : acquérez toujours les verrous dans le même ordre. Détection des blocages : utilisez des algorithmes pour détecter et résoudre les blocages. Timeout : définissez une valeur de délai d'attente pour le verrou afin d'empêcher les threads d'attendre indéfiniment. Inversion des priorités : attribuez des priorités différentes pour réduire le risque de blocage.
Un blocage est une erreur de programmation dans laquelle deux threads ou plus sont bloqués indéfiniment, attendant que l'autre libère le verrou. Cela est généralement dû à des verrous cycliquement dépendants, où un thread détient le verrou A et attend le verrou B, tandis qu'un autre thread détient le verrou B et attend le verrou A.
Les techniques suivantes sont courantes pour éviter les impasses :
Prenons l'exemple de code suivant où deux threads tentent d'accéder à une ressource partagée :
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(); }
Dans cet exemple, les threads 1 et 2 tentent d'acquérir le même verrou (resource.m_mutex< /code >) pour mettre à jour la variable <code>m_value
. Si le thread 1 acquiert le verrou en premier, le thread 2 sera bloqué, et vice versa. Cela peut conduire à des dépendances circulaires et à des blocages. resource.m_mutex
) 来更新 m_value
变量。如果线程 1 先获取锁,则线程 2 将被阻止,反之亦然。这可能会导致循环依赖和死锁。
为了修复此问题,我们可以使用加锁顺序。例如,我们可以让所有线程先获取 resource.m_mutex
锁,再获取 m_value
resource.m_mutex
en premier, puis acquérir le verrou 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(); }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!