Terminate called without an active exception

Я получаю С++-ошибку с threading:

Что я делаю неправильно и как исправить ошибку?

Когда объект потока выходит из области действия и он находится в состоянии соединения, программа завершается. У стандартного комитета были два других варианта деструктора сплошной нити. Он может спокойно присоединиться, но соединение никогда не вернется, если поток застрял. Или он может отсоединить нить (отсоединенная резьба не соединяется). Однако отдельные потоки очень сложны, так как они могут выжить до конца программы и испортить выпуск ресурсов. Поэтому, если вы не хотите прекращать свою программу, убедитесь, что вы присоединяете (или отсоединяете) каждый поток.

Как воспроизвести эту ошибку:

Скомпилировать и запустить:

Вы получаете эту ошибку, потому что не присоединились или не отсоединили свой поток.

Один из способов исправить это, присоедините поток следующим образом:

Затем скомпилируйте и запустите:

Другой способ исправить это, отделить его следующим образом:

Скомпилировать и запустить:

Читайте об отсоединении потоков С++ и подключении потоков С++.

Эрик Лещинский и Бартош Милевский уже дали ответ. Здесь я попытаюсь представить его более дружелюбным образом.

Как только поток запущен в пределах области (которая сама запускается в потоке), необходимо явно убедиться, что одно из следующего происходит до того, как поток выходит из области видимости:

  • Время выполнения выходит из области действия, только после того, как этот поток завершит выполнение. Это достигается путем соединения с этим потоком. Обратите внимание на язык, это внешняя область, которая соединяется с этим потоком.
  • Среда выполнения оставляет поток для запуска самостоятельно. Таким образом, программа выйдет из области, независимо от того, закончил ли этот поток выполнение или нет. Этот поток выполняется и выходит сам по себе. Это достигается путем отсоединения резьбы. Это может привести к проблемам, например, если поток ссылается на переменные в этой внешней области.
Читайте также:  Автокад убрать рамку вокруг растрового изображения

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

Я получаю ошибку C++ с потоковой передачей:

что я делаю неправильно и как исправить ошибку?

3 ответов

когда объект потока выходит из области видимости и находится в присоединяемом состоянии, программа завершается. У стандартного комитета было два других варианта деструктора соединяемой нити. Он может тихо присоединиться , но соединение может никогда не вернуться, если нить застряла. Или он может отсоединить нить (отсоединенная нить не соединяется). Однако отдельные потоки очень сложны, так как они могут выжить до конца программы и испортить выпуск ресурсов. Так что если вы не хотите завершите свою программу, убедитесь, что вы присоединяетесь (или отсоединяете) каждый поток.

как воспроизвести эту ошибку:

скомпилировать и запустить:

вы получаете эту ошибку, потому что вы не присоединились или отсоединить поток.

один из способов исправить это, присоединиться к потоку следующим образом:

затем скомпилируйте и запустите:

другой способ исправить это, отсоединить его следующим образом:

скомпилировать и запустить:

Читать далее отсоединение потоков C++ и присоединение потоков C++.

Эрик Лещинский и Бартош Милевский уже дали ответ. Здесь я постараюсь представить его в более дружелюбной манере для начинающих.

Как только поток был запущен в области (которая сама работает в потоке), необходимо явно обеспечить одно из следующих событий, прежде чем поток выйдет из области:

  • среда выполнения выходит из области, только после завершения выполнения этого потока. Это достигается путем соединения с этой нитью. Примечание язык, это внешняя область, которая соединяется с этим потоком.
  • среда выполнения оставляет поток для запуска самостоятельно. Таким образом, программа выйдет из области, независимо от того, завершен ли этот поток или нет. Этот поток выполняется и завершается сам по себе. Это достигается путем отсоединения потока. Это может привести к проблемам, например, если поток ссылается на переменные в этой внешней области.
Читайте также:  Wifi expert ru личный кабинет вход

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

I am getting a C++ error with threading:

Here is the code:

What am I doing wrong and how do I fix the error?

5 Answers 5

When a thread object goes out of scope and it is in joinable state, the program is terminated. The Standard Committee had two other options for the destructor of a joinable thread. It could quietly join — but join might never return if the thread is stuck. Or it could detach the thread (a detached thread is not joinable). However, detached threads are very tricky, since they might survive till the end of the program and mess up the release of resources. So if you don’t want to terminate your program, make sure you join (or detach) every thread.

How to reproduce that error:

Compile and run:

You get that error because you didn’t join or detach your thread.

One way to fix it, join the thread like this:

Then compile and run:

The other way to fix it, detach it like this:

Compile and run:

Read up on detaching C++ threads and joining C++ threads.

Eric Leschinski and Bartosz Milewski have given the answer already. Here, I will try to present it in a more beginner friendly manner.

Once a thread has been started within a scope (which itself is running on a thread), one must explicitly ensure one of the following happens before the thread goes out of scope:

  • The runtime exits the scope, only after that thread finishes executing. This is achieved by joining with that thread. Note the language, it is the outer scope that joins with that thread.
  • The runtime leaves the thread to run on its own. So, the program will exit the scope, whether this thread finished executing or not. This thread executes and exits by itself. This is achieved by detaching the thread. This could lead to issues, for example, if the thread refers to variables in that outer scope.
Читайте также:  D link des 1008d блок питания

Note, by the time the thread is joined with or detached, it may have well finished executing. Still either of the two operations must be performed explicitly.

Rate this post

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *