Nano Hash - криптовалюты, майнинг, программирование

Деструкторы C++ и PTHREAD_CANCEL_ASYNCHRONOUS

Гарантируется ли выполнение деструкторов для автоматических объектов, если поток отменяется асинхронно?


  • Это будет зависеть от вашей платформы и компилятора. Стандарт C++ не знает о существовании PThreads. Какую платформу и компилятор вы используете? 05.07.2011
  • Вы должны быть более конкретными в вопросе. Какие автоматические объекты, какая система потоков, как вы отменяете поток? 05.07.2011
  • Спасибо, Родди, это произошло из-за моего невежества, а не халатности. 06.07.2011

Ответы:


1

Теоретически он ДОЛЖЕН работать нормально, но его стоит протестировать на вашей платформе.

Отмена потока в конечном итоге приводит к вызову pthread_exit(), который, насколько я могу судить по гуглю, вызовет деструкторы. Он делает это, выбрасывая какое-то «гарантированное необработанное» исключение на всем пути к оболочке потока, поэтому все ваши объекты на основе стека уничтожаются в правильном порядке.

См. эту страницу. пример. И эту запись в блоге:

При вызове pthread_exit() в C++ он должен уничтожить все объекты, созданные в стеке. Этот процесс называется раскруткой стека, и это именно то, что происходит, когда вы выдаете исключение. Функция pthread_exit() использует эту возможность C++ для очистки перед тем, как закрыть поток навсегда.

Для этого pthread_exit() генерирует какое-то неясное исключение и перехватывает его прямо перед тем, как отключить поток. Таким образом, он хорошо очищает все объекты. С другой стороны, поймать… становится невозможно.

05.07.2011
  • Спасибо за эту информацию. Что касается этого сообщения в блоге, я предполагаю, что улов ... не является проблемой, если блок try просто возвращается из функции потока, а не напрямую вызывает pthread_exit()? 06.07.2011

  • 2

    Технически я думаю, что это вопрос качества реализации: стандарт C++ не касается потоков POSIX, а стандарт потоков POSIX представляет собой привязку языка C, которая не касается C++.

    Так что, в принципе, реализация C++ могла бы заставить это работать (она могла бы даже гарантировать это). На практике я был бы удивлен, если бы это работало либо с отложенной, либо с асинхронной отменой.

    05.07.2011

    3

    Ваш вопрос некорректен. В стандартном C++ до C++0x нет «потоков», а в C++0x нет асинхронной отмены потоков. Таким образом, нет ответа на ваш вопрос вне конкретной реализации C++ и pthreads, которую вы используете.

    Тем не менее, ответ на вашу реализацию, вероятно, «нет». (По крайней мере, я не знаю ни одной реализации, в которой ответ положительный.)

    [редактировать]

    Хорошо, значит, мои знания устарели. В Linux, по крайней мере, с современной библиотекой потоков, стек обычно раскручивается (согласно ответу @Roddy).

    Однако верно и то, что такое поведение не гарантируется никаким стандартом.

    05.07.2011
  • Это потоки. Это довольно ясно из тегов и заголовка. И это стандарт posix, насколько мне известно. 06.07.2011
  • @Roddy: Да, но потоки POSIX — это интерфейс C, а не интерфейс C++. Таким образом, стандарт POSIX ничего не говорит об этом вопросе. 06.07.2011
  • Меня интересует реализация Linux, а не то, что указано в стандарте. Стандарты редко выполняются на 100,0% в соответствии со спецификацией. 06.07.2011
  • @Borislav: Хорошо, но вы всегда должны писать свой код в соответствии со стандартами, где это возможно, поскольку 90% стоимости всего программного обеспечения составляет обслуживание. Просто потому, что что-то работает на вашей конкретной машине сегодня, не означает, что это будет работать там, где вы хотите запустить свой код завтра. (Кстати, отмена асинхронного потока почти свидетельствует о плохой и хрупкой конструкции. Вот почему потоки C++0x не поддерживают отмену...) 06.07.2011
  • Немо, я читал обсуждения, в том числе такие люди, как Энтони Уильямс, который разработал большую часть многопоточности C++0x, и причина, по которой синхронное/совместное прерывание не поддерживалось, связана с разногласиями по различным деталям, а не с возможностью сделать это вообще. . Прерывание потока также является частью потоков Boost. Так что неверно утверждать, что именно поэтому потоки C++0x не поддерживают отмену. Возможно, вы хотели написать, что они не поддерживают асинхронную отмену, что вполне может иметь место. [продолжение] 07.07.2011
  • [продолжение] Однако стандарт не может охватить все ситуации, и не без оснований std::thread позволяет получить собственный дескриптор. Некоторые из потоков, которые я запускаю, выполняют код, который я не создавал, и вполне могут считаться черным ящиком, поэтому я не могу предположить, что синхронной отмены достаточно, и основное приложение должно, по спецификации, иметь возможность перезапустить их в некоторых условиях, если они торгуются, не перезапуская весь процесс. Я не могу просто сделать их отдельными процессами из-за значительной общей памяти (попробовал shmem, и это слишком медленно) и планирования задач на основе пула потоков. 07.07.2011
  • @Borislav: Но если код представляет собой черный ящик, это еще хуже, потому что тогда вы никогда не знаете, опасна ли асинхронная отмена. Не весь код C++ (особенно внутри черного ящика) написан для использования RAII, и даже если это так, системные библиотеки обычно пишутся на C. В качестве тривиального примера: что, если вы отмените поток в середине malloc() пока он держит мьютекс кучи? Боюсь, вы беретесь за неразрешимую задачу... 08.07.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..