Добрый день,
В руководстве по силктесту есть упоминание про конструкцию critical. Как я поняла, если есть несколько потоков spawn и управляющий поток critical, то как только critical заканчивается, то прерываются и все остальные. Так ли это на самом деле? Если можно, приведите простенький пример, как это работает. Большое спасибо.
Как работает блок critical?
Автор Ul_Svetlana, 13 дек 2007 07:10
Сообщений в теме: 2
#1
Отправлено 13 декабря 2007 - 07:10
#2
Отправлено 13 декабря 2007 - 08:39
Не совсем так. Этот блок является таким же spawn блоком, что и остальные и если вдруг он прервал выполнение, то прерываются остальные потоки, запущенные в параллели с данным. То есть это не управляющий блок, а скорее блок повышенного контроля и особой важности, без выполнения которого остальные блоки не могут или не должны выполнятьсяДобрый день,
В руководстве по силктесту есть упоминание про конструкцию critical. Как я поняла, если есть несколько потоков spawn и управляющий поток critical, то как только critical заканчивается, то прерываются и все остальные. Так ли это на самом деле? Если можно, приведите простенький пример, как это работает. Большое спасибо.
Основной принцип моего существования — служение гуманистическим идеалам человечества.
#3
Отправлено 13 декабря 2007 - 12:02
народ! нельзя же просто так читать - нужно когда-то и пробовать!
вкратце - critical секция - это поток, который будет исполняться монопольно. Во время его работы все остальные потоки заморозятся.
кстати - главный код (тот, котрый вне пределов spawn) это тоже поток, почти такой же, как и остальные
И насчет эксепшенов в потоках - при распространении эксепшена за пределы блока spawn (т.е. не перехваченный raise/reraise) - убивается данный поток и все остальные вместе с ним.
вкратце - critical секция - это поток, который будет исполняться монопольно. Во время его работы все остальные потоки заморозятся.
кстати - главный код (тот, котрый вне пределов spawn) это тоже поток, почти такой же, как и остальные
И насчет эксепшенов в потоках - при распространении эксепшена за пределы блока spawn (т.е. не перехваченный raise/reraise) - убивается данный поток и все остальные вместе с ним.
[-] main () [ ] int i [-] spawn [-] for i = 1 to 10 [ ] Print (i,TimeStr()) [-] spawn [ ] Print ("B",TimeStr()) [ ] Sleep (2) [ ] Print ("B",TimeStr()) [ ] rendezvous [ ] Print ("C",TimeStr())инструкция к коду: 1-запустить в этом виде. 2-поменять второй спавн на критикал и запустить. 3-убрать рандеву (rendezvous) и попробовать без него ;)
Количество пользователей, читающих эту тему: 0
0 пользователей, 0 гостей, 0 анонимных