Путаница синхронизации потоков, когда два потока вызывает тот же метод

голоса
0

Я создал библиотеку курьера, и я сделал это поточно поэтому может быть разделено вокруг между потоками без беспокойства. Я этого добиться в основном с помощью класса Monitor.

У меня есть Выход рутина, который может занять некоторое время, чтобы закончить, потому что он пытается ждать сделок, имеющих место, прежде чем он закрывает сокет и т.д. Это асинхронное и Begin / метода End, но для этого примера мы будем просто делать вид, что синхронные.

Что делать, если две нити называют Logout, один за другим? Что я должен делать со второй нитью?

В настоящее время я блок (с использованием Monitor.Wait ждать импульса от первого потока) до тех пор, первый выход из системы не завершится, а затем бросить AlreadyLoggedOutException.

Я также играл с наличием исключения LogoutInProgress брошенного если Выход вызываются, но выход из системы уже происходит.

И, кажется, имеют свои преимущества и недостатки, но я хотел бы знать, что думают другие люди лучше.

Задан 08/04/2012 в 23:43
источник пользователем
На других языках...                            


2 ответов

голоса
2

Что это лучший вариант из двух вы говорили, зависит от того, как вы хотите, чтобы ваша библиотека вести себя.

Я бы не бросить исключение к потребителю и просто сгореть конец выход из системы асинхронных событий / метод для обоего потоков, когда фактический выход из системы завершается. Какой примитив синхронизации вы должны использовать для достижения этой цели зависит от конструкции вашего метода / библиотеки. Может быть, если вы разделяете более подробную информацию о методе Begin End вы упомянули, я буду в состоянии предложить лучше.

Этот вариант будет легче программировать против.

Ответил 08/04/2012 в 23:53
источник пользователем

голоса
0

Существует 3-й вариант: Второй поток пытается Выход может обнаружить, что выход из системы уже произошло, и ничего не делать. Если договор «Выход из системы» является «либо убедитесь, что пользователь выходит из системы, или выбросить», то вы действительно должны сделать Выход идемпотент.

Однако, если вы не можете терпеть многочисленные выходы из системы, так как это было бы логическая ошибка или иначе, вы должны бросить исключение.

Ответил 09/04/2012 в 00:45
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more