Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
В данной ситуации придётся разблокировать уже выделенные ресурсы и заблокировать их по новойТакое далеко не всегда возможно, если дополнительные ресурсы понадобились в середине операции, которая с точки зрения доступа к захваченному ресурсу является транзакцией, накладные расходы зачастую полностью невелируют простоту использования подобной стратегии блокировок.
Поток выполнялся и завис. Все, прощайте ресурсы.
Но после выполнения половины действий поток А должен синхронизировать данные с потоком Б
В данном случае при любом раскладе программа становится неуправляемой и требуется перезапуск.Боже, ненавижу программы, которые вылетают из за любой мелкой ошибки. Ну нельзя же так сразу перезапускать — а если там работа пользователя, которую он делал последние несколько часов? Да и что мешает откатить состояние? Обычно зависание потока, выполняющего делегированную задачу, вполне можно обработать и вернуть программу в консистентное состояние прозрачно для пользователя.
Если поток хотя бы иногда выделяет память динамически, его уже нельзя убивать.
И вообще — я вполне знаю что это за поток, и для чего он предназначен, вопрос только в проектировании верной архитектуры, которая может это сделать.
Если я знаю, что поток не выполняет код, который, будучи прерванным — может оставить в неконсистентном состоянии другие части системы в неизвестных местах — его можно убивать.
Как самый очевидный пример — поток нельзя убивать, даже если он просто выделяет динамическую память.Говорю же — это верно не всегда.
Ну и я предпочту убить поток и сохранить то, что можно сохранить, чем убить приложение.
По поводу «не знать» и «забыл»
Если я знаю, что поток не выполняет код, который, будучи прерванным — может оставить в неконсистентном состоянии другие части системы в неизвестных местах — его можно убивать.А вы пишете что это нельзя сделать тривиально, по взмаху волшебной палочки.
что делать, если поток блокирует ресурс на длительный период
что за synh_
Не блокировать общие ресурсы на длительное время.Я не знаю как это реализовать — поэтому это плохо?
synh_ — экземпляр стратегии синхронизацииОтлично — что происходит при выполнении метода lock?
Есть случаи, когда надо захватить ресурс на все время выполнения задачи, а оно может составлять несколько секундИменно для таких ресурсов, захват которых осуществляется на длительное время и предназначен асинхронный lock. Далее, в общем случаи блокировка shared данных на длительное время не есть гуд, так как они на то и общее, что подразумевают использование из разных потоков.
Отлично — что происходит при выполнении метода lock
SynchronizationManager::getInstance().lock( lock_list+0, lock_list+3 );
SynchronizationManager::getInstance().lock( lock_list+0, lock_list+ARRAY_SIZE(lock_list) );
Заметки о синхронизации. Deadlock