Информация об изменениях

Сообщение 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

Только не факт, что зайдёт, и что он в финале будет достаточно упорот, чтобы не просто генерировать методы, а изменять существующие методы.
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

Только не факт, что зайдёт, и что он в финале будет достаточно упорот, чтобы не просто генерировать методы, а изменять существующие методы.