Внедрение исключения C ++ в другой поток

С помощью функции exception_ptr C ++ 0x можно сохранить исключение в одном потоке и получить к нему доступ другой поток. Однако другой поток должен вызвать rethrow_exception (). Однако в некоторых случаях мне нужно фактически прервать другой поток и немедленно вызвать исключение; опрос исключения_ptr для ненулевого значения не является решением.

Я нашел решение, как внедрить исключение в Windows на http://www.codeproject.com/KB/exception/ExcInject.aspx , приостановив поток и изменив его регистр указателя инструкций перед возобновляя это. Однако мне также нужен мой код для работы в Linux. Как мне это сделать?

Если я использую что-то вроде getcontext (), которое получает контекст текущего потока (тогда как в Windows GetContext () принимает параметр потока), мне придется вызывать его в обработчике сигнала . Но я читал, что getcontext () / setcontext () не следует вызывать в обработчиках сигналов ... Как мне это сделать?

Если я использую что-то вроде getcontext (), которое получает контекст текущего потока (тогда как в Windows GetContext () принимает параметр потока), мне придется вызывать его в обработчике сигнала . Но я читал, что getcontext () / setcontext () не следует вызывать в обработчиках сигналов ... Как мне это сделать?

Если я использую что-то вроде getcontext (), которое получает контекст текущего потока (тогда как в Windows GetContext () принимает параметр потока), мне придется вызывать его в обработчике сигнала . Но я читал, что getcontext () / setcontext () не следует вызывать в обработчиках сигналов ... В качестве альтернативы я мог бы вызвать rethrow_exception () непосредственно в обработчике сигнала, но я беспокоюсь, что это не будет иметь ожидаемого эффекта, когда прерванный поток разворачивает стек таким же образом со всеми деструкторами области, в которой было прерывание звонили и т. д.

5
задан Display Name 10 December 2010 в 22:05
поделиться