Re[5]: Межпотоковое кидание исключений
От: Игoрь Украина  
Дата: 04.06.05 15:21
Оценка: 58 (6)
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, MaximE, Вы писали:


>>> ME>Вывод из этого следующий: ты просто не можешь прервать выполнение любого потока в произвольной точке и перевести управление при помощи исключения в другую точку, ожидая при этом, что состояние структур данных сохранит инвариант и останется в каком-либо относительно корректном состоянии.


К>Давайте вспомним исходную задачу:

К>Ведомый поток зависает в какой-то системной функции. Хочется вышибить его оттуда наименее болезненным способом.
К>TerminateThread() (или даже exit()) — заведомо худший вариант.

Если исходный поток "зависает" в какой-то системной функции, то таким макаром его нельзя вышибить (во всяком
случае в винде). Все дело в том, что такой поток исключается из очереди готовности (ready queue) и переводится
в waiting queue. Обратно он будет переведен, только после того, как сработает соотв. ожидаемый объект, или истечет
время заданное sleep'ом.

Так что реальное использование такой методы очень сомнительно и небезопасно.

ЗЫ
Проверил на Sleep'е — исключение возникает только после истечения соотв. времени ожидания...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.