Модель приложений .NET. Потоки.
Программа теперь имеет два потока: первоначальный, который выполнял код запуска потока, и поток, который мы только что создали и который попытается забронировать места в гостинице.
public _gc class NewReservation // класс сборщика мусора NewReservation { public: void MakeReservation() { Console::WriteLine( "Thread {0} starting.", // Запускается поток {О}. Thread::CurrentThread › // Поток GetHashCode().ToString()); ReservationResult *result = hotelBroker › MakeReservation( customerld, city, hotel, date, numberDays); // customerld, город, гостиница, дата, numberDays } };
Затем в методе Main (Главный) следующий код запускает поток, используя при этом делегат:
NewReservation *reservel = new NewReservation(customers, hotelBroker); // клиенты reservel › customerld = 1; reservel › city = "Boston"; // город = "Бостон"; reservel › hotel = "Presidential"; // гостиница = "Президентская"; reservel › sdate = "12/12/2001"; reservel › numberDays = 3; // создать делегат для потоков ThreadStart *threadStartl = new ThreadStart( reservel, reservel › MakeReservation); Thread *threadl = new Thread(threadStartl); // новый Поток Console::WriteLine( "Thread {0} starting a new thread.", // "Поток {0} запускает новый поток. " Thread::CurrentThread › // Поток GetHashCode().ToString()); threadl › Start ();
Чтобы заставить первоначальный поток ожидать завершения работы второго потока, вызывается метод Join (Объединить) объекта Thread (Поток). Первоначальный поток теперь заблокирован (находится в состоянии ожидания), пока не завершит работу поток, резервирующий место в гостинице. Результат запроса резервирования места выводится на консоль резервирующим потоком.
// Блокировать этот поток, пока не завершится рабочий поток threadl › Join(); // Объединение Console::WriteLine("Done!"); // Завершен
Синхронизация потоков
Приложение может создать несколько потоков. Сейчас мы рассмотрим код на шаге 1 из примера Threading (Организация поточной обработки). Теперь несколько запросов о резервировании делаются одновременно.
NewReservation *reservel = new NewReservation(customers, hotelBroker); // клиенты NewReservation *reserve2 = new NewReservation(customers, hotelBroker); // клиенты // создать делегат для потоков ThreadStart *threadStartl = new ThreadStart( reservel, reservel › MakeReservation); ThreadStart *threadStart2 = new ThreadStart( reserve2, reserve2 › MakeReservation); Thread *threadl = new Thread(threadStartl); // новый Поток Thread *thread2 = new Thread(threadStart2); // новый Поток Console::WriteLine( "Thread {0} starting a new thread.", // "Поток {0} запустил новый поток. " Thread::CurrentThread › // Поток GetHashCode().ToString()); threadl › Start(); // Пуск thread2 › Start();// Пуск // Блокировать этот поток, пока не завершится рабочий поток threadl › Join(); // Объединение thread2 › Join(); // Объединение