Сообщение Re[3]: Автопрогресс и автопрерываемость в С++ от 21.03.2018 8:52
Изменено 21.03.2018 9:36 Alexander G
Re[3]: Автопрогресс и автопрерываемость в С++
Здравствуйте, GhostCoders, Вы писали:
AG>>В общем авто-магии не получится. Все проблемы интерапшинов из boost::thread будут.
GC>Не работал с boost.thread. А он, что, поддерживает прерываемость?
boost::thread похож на std::thread (ибо был прототипом std::thread), но имеет расширения, одно из — интеррапшин поинты.
Любая точка прерывания бросает thread_interrupted исключение, если поток прервали.
Точками прерывания являются явные вызовы interruption_point.
Кроме того, любое ожидание, будь то sleep, захвата мьютекса, условной переменной — всё является точками прерывания.
То есть, если поток сейчас ждёт мьютекс, и его прервали, он вылетит тут же.
Разумеется, работает только с примитивами из boost, в них заложено ожидание на событии прерывания одновременно с основным ожиданием.
Для борьбы с исключениями в деструкторах создают на стеке disable_interruption.
Для борьбы с борьбой с исключениями создают на стеке restore_interruption.
thread_interrupted исключение целенаправленно не наследуется от std::exception, чтобы оно прошло через все catch(std::exception&) и завершило thread.
Но если в треде есть catch(...), то он съест thread_interrupted исключение, и вместо полного прерывания нити будет просто раскрутка до этого catch(...)
GC>То есть, я думаю что это нельзя сделать в compile-time при помощи одного С++. Только расширение, основанное на Clang писать?
На данный момент нет, вроде ничего такого нет.
Может, препроцессором?
Были пропозл по метаклассам, должен решать кодогенерационные задачи.
Для кодогенерации не привязанной к конкретному классу там были namespace class. My namespace — my rules
Только не факт, что зайдёт, и что он в финале будет достаточно упорот, чтобы не просто генерировать методы, а изменять существующие методы.
AG>>В общем авто-магии не получится. Все проблемы интерапшинов из boost::thread будут.
GC>Не работал с boost.thread. А он, что, поддерживает прерываемость?
boost::thread похож на std::thread (ибо был прототипом std::thread), но имеет расширения, одно из — интеррапшин поинты.
Любая точка прерывания бросает thread_interrupted исключение, если поток прервали.
Точками прерывания являются явные вызовы interruption_point.
Кроме того, любое ожидание, будь то sleep, захвата мьютекса, условной переменной — всё является точками прерывания.
То есть, если поток сейчас ждёт мьютекс, и его прервали, он вылетит тут же.
Разумеется, работает только с примитивами из boost, в них заложено ожидание на событии прерывания одновременно с основным ожиданием.
Для борьбы с исключениями в деструкторах создают на стеке disable_interruption.
Для борьбы с борьбой с исключениями создают на стеке restore_interruption.
thread_interrupted исключение целенаправленно не наследуется от std::exception, чтобы оно прошло через все catch(std::exception&) и завершило thread.
Но если в треде есть catch(...), то он съест thread_interrupted исключение, и вместо полного прерывания нити будет просто раскрутка до этого catch(...)
GC>То есть, я думаю что это нельзя сделать в compile-time при помощи одного С++. Только расширение, основанное на Clang писать?
На данный момент нет, вроде ничего такого нет.
Может, препроцессором?
Были пропозл по метаклассам, должен решать кодогенерационные задачи.
Для кодогенерации не привязанной к конкретному классу там были namespace class. My namespace — my rules
Только не факт, что зайдёт, и что он в финале будет достаточно упорот, чтобы не просто генерировать методы, а изменять существующие методы.
Re[3]: Автопрогресс и автопрерываемость в С++
Здравствуйте, GhostCoders, Вы писали:
AG>>В общем авто-магии не получится. Все проблемы интерапшинов из boost::thread будут.
GC>Не работал с boost.thread. А он, что, поддерживает прерываемость?
boost::thread похож на std::thread (ибо был прототипом std::thread), но имеет расширения, одно из — интеррапшин поинты.
Любая точка прерывания бросает thread_interrupted исключение, если поток прервали.
Точками прерывания являются явные вызовы interruption_point.
Кроме того, некоторые ожидания: sleep, условной переменной, join — всё является точками прерывания.
То есть, если поток сейчасждёт мьютекс ждёт на условной переменной, и его прервали, он вылетит тут же.
Разумеется, работает только с примитивами из boost, в них заложено ожидание на событии прерывания одновременно с основным ожиданием.
Для борьбы с исключениями в деструкторах создают на стеке disable_interruption.
Для борьбы с борьбой с исключениями создают на стеке restore_interruption.
thread_interrupted исключение целенаправленно не наследуется от std::exception, чтобы оно прошло через все catch(std::exception&) и завершило thread.
Но если в треде есть catch(...), то он съест thread_interrupted исключение, и вместо полного прерывания нити будет просто раскрутка до этого catch(...)
GC>То есть, я думаю что это нельзя сделать в compile-time при помощи одного С++. Только расширение, основанное на Clang писать?
На данный момент нет, вроде ничего такого нет.
Может, препроцессором?
Были пропозл по метаклассам, должен решать кодогенерационные задачи.
Для кодогенерации не привязанной к конкретному классу там были namespace class. My namespace — my rules
Только не факт, что зайдёт, и что он в финале будет достаточно упорот, чтобы не просто генерировать методы, а изменять существующие методы.
AG>>В общем авто-магии не получится. Все проблемы интерапшинов из boost::thread будут.
GC>Не работал с boost.thread. А он, что, поддерживает прерываемость?
boost::thread похож на std::thread (ибо был прототипом std::thread), но имеет расширения, одно из — интеррапшин поинты.
Любая точка прерывания бросает thread_interrupted исключение, если поток прервали.
Точками прерывания являются явные вызовы interruption_point.
Кроме того, некоторые ожидания: sleep, условной переменной, join — всё является точками прерывания.
То есть, если поток сейчас
Разумеется, работает только с примитивами из boost, в них заложено ожидание на событии прерывания одновременно с основным ожиданием.
Для борьбы с исключениями в деструкторах создают на стеке disable_interruption.
Для борьбы с борьбой с исключениями создают на стеке restore_interruption.
thread_interrupted исключение целенаправленно не наследуется от std::exception, чтобы оно прошло через все catch(std::exception&) и завершило thread.
Но если в треде есть catch(...), то он съест thread_interrupted исключение, и вместо полного прерывания нити будет просто раскрутка до этого catch(...)
GC>То есть, я думаю что это нельзя сделать в compile-time при помощи одного С++. Только расширение, основанное на Clang писать?
На данный момент нет, вроде ничего такого нет.
Может, препроцессором?
Были пропозл по метаклассам, должен решать кодогенерационные задачи.
Для кодогенерации не привязанной к конкретному классу там были namespace class. My namespace — my rules
Только не факт, что зайдёт, и что он в финале будет достаточно упорот, чтобы не просто генерировать методы, а изменять существующие методы.