pda » 27.10.2005 02:21:54
Э... Это зависит от того, что ты понимаешь под словом все... На самом деле смысл критической секции прост, если кто-то вошёл, то все остальные при попытке входа - тормозят и ждут выхода.
По этому - что значит "одну на все"? В критическую секцию можно входить несколько раз, по этому создавать кажый раз новый объект нет необходимости. Чисто технически, можно использовать одну критическую секцию на всю программу, но это приведёт к лагам из-за возможного неоправдонного использования блокировок.
Критические секции рекомендуется создавать для переменной или группы переменных, с которыми идёт работа из нескольких нитей.
Допустим у нас есть переменные A, B, C и D. Мы работаем одновременно из нескольких нитей с A, B и C, D. При этом, пары A-B и C-D обрабатываются независимо друг от друга. В этом случае нам желательно создать две критические секции C1 и C2, которые будут защищать данные пар A-B и C-D соответсвенно.
Усложним ситуацию. Допустим мы хотим поработать одновременно со всеми четырьмя переменными. При этом, из соображения производительности, мы решили, что используем две критические секции. Это значит, что нам надо войти в обе.
Если таких мест в программе несколько, то вопрос порядка входа становится важным. Может возникнуть ситуация, назвваемая бесконечной блокировкой (дедлок, deadlock). Когда одна нить вошла в критическую секцию C2 и теперь пытается войти в C1, а другая вошла в C1 и теперь хочет войти в C2. Естественно, в этом случае программа останется блокированной навечно.
В этом случае решением является раз и навсегда определить порядок входа в критические секции. В более сложном виде это выглядит так: допустим у нас есть три критические секции A, B и C.
Если мы хотим работать только с данными, которые защищает A, B или С, то мы просто входим в соответсвующую критическую секцию и выходим по завершению.
Но если мы захотим использовать все данные, то мы должны входить в критические секции в выбранном порядке, здесь - по алфавиту:
A
B
C
Выход осуществляется в обратном порядке:
C
B
A
Если нам нужны данные только С и В, то мы входим только в порядке:
B
C
даже, если с B нам надо работать совсем немного и в самой глубине кода, работающего с C.
В общем случае, рекомендуется по возможности сокращать время, проводимое программой в критических секциях.
B)