Что происходит с глобальным уникальным PTR после выхода из основного потока

В С++, если у меня есть глобальная переменная, которая является уникальным указателем на класс. Эта глобальная переменная должна быть инициализирована до выполнения main. Допустим, в main создано несколько потоков, и этим потокам необходимо прочитать ресурсы, находящиеся за уникальным указателем.

Вопрос: Когда этот уникальный указатель уничтожается? Это когда основной поток выходит из основной функции или вызывает выход?

какое количество ссылок? Это уникальный указатель, у него всего 1 владелец. Пожалуйста, по одному вопросу на вопрос

463035818_is_not_an_ai 13.08.2024 22:37

«Означает ли это другие процессы…» вы имеете в виду потоки? Или процессы?

463035818_is_not_an_ai 13.08.2024 22:37

«...Кто отвечает за счетчик ссылок уникального указателя...» уникальный указатель не имеет счетчика ссылок. Объекты со статическим временем жизни уничтожаются в порядке, обратном построению, после возврата из main.

Richard Critten 13.08.2024 22:39

имхо, вам следует написать небольшой минимально воспроизводимый пример и задать по этому поводу один конкретный вопрос. В настоящее время ваш вопрос(ы) неясен, похоже, вы имеете в виду какие-то проблемы, но неясно, какие

463035818_is_not_an_ai 13.08.2024 22:40

И уничтожение всех объектов с длительностью хранения потока происходит до уничтожения любого объекта со статической длительностью хранения - даже если объекты с продолжительностью хранения потока были созданы первыми.

Ted Lyngmo 13.08.2024 22:51

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

Ted Lyngmo 13.08.2024 22:54

Функция входа main вызывается загрузчиком запуска примерно так: void startup() { /*...initialize globals...*/; exit(main(argc, argv)); } Глобальные и локальные статические переменные разместили свои деструкторы с помощью atexit. Если во время удаления atexit возникнет исключение, оно завершит работу приложения (что, вероятно, останется незамеченным). Другие ваши потоки должны были быть присоединены до возврата основного потока.

Eljay 13.08.2024 23:01

Рекомендация: избавьтесь от глобальной переменной. Глобальные переменные могут облегчить написание кода, но они НАМНОГО усложняют отладку программ. Поскольку отладка почти всегда НАМНОГО сложнее, чем написание, в ваших интересах перенести трудность туда, где она окажет наименьшее влияние, а именно на сторону написания.

user4581301 13.08.2024 23:02

Когда основной поток завершается, ваша программа завершилась. «Другие потоки» ничего не делают.

Drew Dormann 13.08.2024 23:03
This global var should be initialized before main gets execute Ни один хороший код не имеет глобальных переменных. Также будьте предельно ясны, что вы подразумеваете под «поток закончился», хороший дизайн потока имеет совместное завершение, и ваш вопрос сводится к обычному правилу: ваша жизнь заканчивается, когда заканчивается область, в которой принадлежит уникальный указатель.
Pepijn Kramer 13.08.2024 23:12
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
10
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я считаю, что это должно работать следующим образом:

  • unique_ptr, будучи статическим объектом, уничтожается в порядке, обратном его созданию (порядок среди таких объектов трудно контролировать, но он находится до (конструкции)/после (уничтожения) main()).
  • Теперь есть три возможности, в зависимости от состояния ваших потоков:
    • У вас есть присоединяемая тема. Его деструктор вызовет std::terminate(), и ваша программа завершится.
    • Вы уже присоединились ко всем темам. На этом этапе ваша программа снова становится однопоточной, поэтому ничего интересного не происходит.
    • У вас оторвались темы. Это подробно обсуждается на странице этого вопроса. По сути, очень легко столкнуться с неопределённым поведением, но на практике похоже, что ОС, вероятно, уничтожит ваши потоки при выходе из основного потока.

Кроме того, unique_ptr не имеет счетчика ссылок, он является единственным (уникальным) владельцем объекта, и при его уничтожении объект уничтожается.

Примечание: как только у вас есть несколько единиц перевода (TL;DR: несколько скомпилированных файлов cpp), все становится намного сложнее. Порядок создания и уничтожения элементов в единице перевода четко определен, но порядок, в котором единицы перевода создают и уничтожают, нет. Прочтите «Фиаско статического порядка инициализации», если хотите узнать кровавые подробности о том, как это может полностью <ругательство удалено> вывести из строя ваши программы.

user4581301 13.08.2024 23:14

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

user4581301 13.08.2024 23:18

Другие вопросы по теме