Я задал этот вопрос в интервью # .net/C:Сделки - Как избежать взаимоблокировок?
Если мы имеем две нити Т1 и Т2. T1 получает блокировку на obj1 и затем выполняет некоторую обработку и получает блокировку на obj2. T2 получает блокировку на obj2 и , затем выполняет некоторую обработку и приобретает замок на obj1. Таким образом, мы можем иметь тупик . Что общего метода , который мы используем в многопоточности, чтобы избежать этой ситуации?
Я ответил сказав, что T1 и T2 должны иметь некоторый механизм для связи, и мы должны сделать кодирование таким образом, что T2 начинает делать свою работу только после того, как T1 сигнализировал, что это делается с его работой. Интервьюер спросил меня, знаю ли я о транзакциях и как мы можем использовать его, чтобы встретить эту тупиковую ситуацию. У меня есть много опыта многопоточности на стороне пользовательского интерфейса в winforms. Но я никогда не использовал транзакции. Может кто-нибудь рассказать мне больше об этом или указать мне на url/book,
@ Аш Я получаю возможность приобретения замков в том же порядке. Но что же это за транзакции? – Sandbox
@Sandbox, мне кажется, что они говорят о «транзакции» в общем смысле, гарантируя, что куча отдельных операций выполняется как одна (то есть атомарно). В базе данных это достигается с помощью ключевого слова Begin Transaction, в .net оно выполняется (обычно) с помощью оператора блокировки. В моем ответе я добавил очень рекомендуемую книгу Джо Даффи. – Ash