portnov т.е. захватываем их в определённом порядке когда нам надо, а потом отпускаем все сразу когда уже всё сделали (ну, какую-то транзакцию прикладную)
Minoru portnov: я не смог придумать жизненный пример для моего примера с двумя локами, так что ты наверняка прав — в жизни такими схемами страдают только те, у кого потом случаются дедлоки :)
portnov дедлоков ещё можно избегать, если в некоторых случаях использовать lock() с нулевым таймаутом, а собственно таймаут реализовывать программно (спинлок)
portnov ну т.е. идея-то простая, если есть поток1, захвативший А и Б, и есть поток 2, захвативший Б, то если он попробует сделать lock(A, timeout=0), ему просто вернётся "не получилось" вместо дедлока, и это можно умно обработать
portnov угу. Просто в реальном коде, когда несколько блокировок, и берутся они не в одном месте кода, становится надо понимать, где мы берём обычный лок, где спинлок, почему именно и что будет если это поменять