История изменений
Исправление dimgel, (текущая версия) :
Необходимо гарантировать, что при любом пути исполнения кода захват и освобождение мьютексов выполняется в фиксированной последовательности, что гарантирует отсутствие деадлоков для данного набора мьютексов.
Хотел было предложить запилить анализатор кода во время компиляции (метапрограммирование, но read-only, без трансформаций). Таким макаром, например, я когда-то проверял всякие условия на своём SQL eDSL в скале, которые если зашивать в систему типов, разбухла бы она до безобразия (ты ведь именно этого хочешь избежать?). Проверка во время компиляции – значит тоже статика, просто сверх того, что умеет собственно язык.
В программе имеются мьютексы m1, m2… mN.
А потом вспомнил из недавно читаного ZeroMQ Guide категорический рецепт избавления от любых проблем с многопоточностью: «just don’t share state». (Мужик конечно жжот, люблю максималистов, хотя по здравому размышлению, заменять atomic bool stopBgThread
посылкой сообщения stop
фоновому потоку я не готов – но твой случай явно посложнее будет.)
Исходная версия dimgel, :
Необходимо гарантировать, что при любом пути исполнения кода захват и освобождение мьютексов выполняется в фиксированной последовательности, что гарантирует отсутствие деадлоков для данного набора мьютексов.
Хотел было предложить запилить анализатор кода во время компиляции (метапрограммирование, но read-only, без трансформаций). Таким макаром, например, я когда-то проверял всякие условия на своём SQL eDSL в скале, которые если зашивать в систему типов, разбухла бы она до безобразия (ты ведь именно этого хочешь избежать?).
В программе имеются мьютексы m1, m2… mN.
А потом вспомнил из недавно читаного ZeroMQ Guide категорический рецепт избавления от любых проблем с многопоточностью: «just don’t share state». (Мужик конечно жжот, люблю максималистов, хотя по здравому размышлению, заменять atomic bool stopBgThread
посылкой сообщения stop
фоновому потоку я не готов – но твой случай явно посложнее будет.)