Architecture Net


         

Изоляция потоков


Исключение, сгенерированное одним потоком, не приведет к отказу в работе другого потока. Пример Threadlsolation демонстрирует это.

_gc class tm
// класс сборщика мусора tm
{
public:
void m() {
Console::WriteLine(
"Thread {0} started", // "Поток {0} начал работу",
Thread::CurrentThread->GetHashCode().ToString());
Thread::Sleep(1000); // Поток:: Бездействует forfint i = 0; i < 10; i++)
Console::WriteLine(i); Console::WriteLine(
"Thread {0} done",
// "Поток {0} закончил",
Thread::CurrentThread->GetHashCode{).ToString());
}
};
_gc class te
// класс сборщика мусора te
{
public:
void tue ()
{
Console::WriteLine (
"Thread {0} started", // "Поток {0} начал работу",
Thread::CurrentThread->GetHashCode().ToString());
Exception *e = new Exception("Thread Exception"); // Исключение *е = новое Исключение ("Исключение Потока"); throw e;
}
};
_gc class Threadlsolation
// класс сборщика мусора Threadlsolation
{
public:
static void Main()
{
tm *tt = new tm;
// новый tm te *tex = new te;
// новый te
// создать делегат для потоков
ThreadStart *tsl = new ThreadStart(tt, tm::m);
ThreadStart *ts2 = new ThreadStart(tex, te::tue);
Thread *threadl = new Thread(tsl);
// новый Поток (tsl) Thread *thread2 = new Thread(ts2);
// новый Поток (ts2)
Console::WriteLine(
"Thread {0} starting new threads.",
// "Поток {0} запускает новые потоки.",
Thread::CurrentThread->GetHashCode().ToString());
threadl->Start(); // Пуск
thread2->Start(); // Пуск
Console::WriteLine(
"Thiead {0} done.", // "Поток {0} закончил.",


Thread::CurrentThread->GetHashCode().ToString());
}
};

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




Содержание  Назад  Вперед