Sobes.tech
Junior — Middle

Бір ағын ішінде бірдей std::mutex-ті қайта блоктау әрекетінің салдары қандай?

sobes.tech AI

AI-дан жауап

Бір ағын ішінде бірдей std::mutex-ті қайтадан блоктау әрекеті deadlock-қа әкеледі, себебі std::mutex рекурсивті блоктауды қолдамайды. Ағын мьютексті босатуды күтеді, бірақ ол оны өзі бұрыннан блоктап қойғандықтан әрі қарай жалғаса алмайды, бағдарлама тұрып қалады.

Егер бір ағын ішінде мьютексті бірнеше рет блоктау мүмкіндігін қажет етсеңіз, std::recursive_mutex қолдану керек, ол бір ағынға бірнеше рет мьютексті блоктауға мүмкіндік береді, бірақ unlock() шақыруларын тең санмен орындау керек.

std::mutex қолданғанда мысал тоқтап қалады:

std::mutex mtx;
mtx.lock();
mtx.lock(); // мұнда deadlock

Ал std::recursive_mutex қолданғанда мұндай жағдай рұқсат етілген.