c # барьер и исключение - PullRequest
       4

c # барьер и исключение

0 голосов
/ 25 июля 2011

Я создал простой пример c #, который использует барьеры, и я выдал исключение внутри одной из функций, и теперь я получаю неожиданный результат

phase 1 of DoWork1
phase 2 of DoWork2
phase 3 of DoWork3
Current phase 0
phase 2 of DoWork3
phase 2 of DoWork1
phase 3 of DoWork2
//so far everything is fine, lets throw an exception now

DoWork1 canceled
phase3 of DoWorn1

//end 

, как вы можете видеть в коде, который я выдал исключениев методе DoWork1 и я ожидал, что все 3 метода будут обрабатывать исключения, но только первый делает, вторая проблема заключается в том, что только первый метод печатает «фаза 3 бла-бла», и я ожидал, что все 3 из них выведут его на консоль.Может ли кто-нибудь объяснить мне, почему это происходит

Код немного длинный, но в большинстве случаев это просто копирование

Ответы [ 2 ]

1 голос
/ 25 июля 2011

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

Во-вторых, причина, по которой два других метода никогда не достигают фазы 3, заключается в том, что когда DoWork1 выдает исключение, это происходит потому, что он пытался ждатьдругие участники этого барьера так и не смогли.В этот момент барьер больше не верит, что DoWork1 ждет других участников, поэтому, когда остальные два SignalAndWait(), они ждут вечно, потому что DoWork1 никогда SignalAndWait с снова.

0 голосов
/ 25 июля 2011

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

...