Модель приложений .NET. Потоки.
Выполнение программы даст приведенный ниже результат:
Added Boston Presidential Hotel with one room. Thread 3 starting a new thread. Thread 5 starting. Thread 6 starting. Reserving for Customer 2 at the Boston Presidential Hotel on 12/13/2001 12:00:00 AM for 1 days Reserving for Customer 1 at the Boston Presidential Hotel on 12/12/2001 12:00:00 AM for 3 days Thread 6 entered Broker::Reserve Thread 6 finds the room is available in Broker::Reserve Thread 5 entered Broker::Reserve Thread 5 finds the room is available in Broker::Reserve Thread 6 left Broker::Reserve Reservation for Customer 2 has been booked Reservationld = 1 Thread 5 left Broker::Reserve Reservation for Customer 1 has been booked Reservationld = 2 ReservationRate = 10000 ReservationCost = 30000 Comment = OK ReservationRate = 10000 ReservationCost = 10000 Comment = OK Done!
Перевод такой:
Добавлена Бостонская Президентская гостиница с одним номером. Поток 3 стартовал новый поток. Поток 5 стартовал. Поток 6 стартовал. Резервирование для Клиента 2 в Бостонской Президентской гостинице на 12/13/2001 12:00:00 AM в течение 1 дня Резервирование для Клиента 1 в Бостонской Президентской гостинице на 12/12/2001 12:00:00 AM в течение 3 дней Поток 6 ввел Брокер:: Резерв Поток 6 находит, что номер доступен в Брокер::Резерв Поток 5 ввел Брокер::Резерв Поток 5 находит, что номер доступен в Брокер::Резерв Поток 6 выходит из Брокер::Резерв Резервирование для Клиента 2 было заказано Reservationld = 1 Поток 5 выходит из Брокер::Резерв Резервирование для Клиента 1 было заказано Reservationld = 2 ReservationRate = 10000 ReservationCost = 30000 Комментарий = OK ReservationRate = 10000 ReservationCost = 10000 Комментарий = OK Сделано!
К сожалению, оба клиента добиваются резервирования последнего (единственного) номера на 13 декабря! Обратите внимание на то, как один из потоков выполняет метод Reserve (Резерв) и находит, что номер доступен прежде, чем прекратит свою работу. Затем другой поток выполняет Reserve (Резерв) и также обнаруживает свободный номер прежде, чем закончится отведенный для него промежуток времени. Потом оба потока заказывают тот же самый номер гостиницы.
Операционные системы предоставляют средства синхронизации взаимодействия нескольких потоков и процессов, получающих доступ к совместно используемым ресурсам. Каркас .NET Framework предусматривает несколько механизмов предотвращения конфликтов между потоками.
Каждый объект в каркасе .NET Framework может использоваться в качестве синхронизирующей секции кода (критической секции). В пределах такой секции одновременно может выполняться только один поток. Если один поток уже выполняется внутри такой синхронизирующей секции кода, любые другие потоки, пытающиеся получить доступ к данной секции, блокируются (и ждут) до тех пор, пока выполняющийся поток не покинет эту секцию кода.