Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Knjagskij
-4 / 6 / 0
Регистрация: 10.11.2008
Сообщений: 775
Завершенные тесты: 1
#1

Потоки без join() или detach() - C++

16.06.2016, 11:11. Просмотров 833. Ответов 14
Метки нет (Все метки)

Почему такой код выводит данные в консоль, не смотря на выбрасывание исключения?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
void proc1(const int num)
{
    int max_i = 50000;
    int i = 0;
    while(i<max_i)
    {
        cout << std::to_string(num);
        ++i;
    }
}
 
void proc2(const int num)
{
    int max_i = 50000;
    int i = 0;
    while(i<max_i)
    {
        cout << std::to_string(num);
        ++i;
    }
}
 
int main()
{
    thread t1(proc1, 5);
    thread t2(proc2, 7);
 
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.06.2016, 11:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Потоки без join() или detach() (C++):

Std::thread::detach() - C++
Что произойдет, если main - поток завершится раньше чем child.detach()? Добавлено через 3 минуты У меня программа просто завершилась...

Использование Attach(HWND) и Detach() - C++
Привет всем! Что делают функции Attach(HWND) и Detach() объявленные в классе CWnd. В MSDN для Attach написано, что она присоединяет...

Как отделить поток с помощью detach? - C++
Вообщем, не могу понять в чем проблема, хочу подвесить фоновый поток для отлавливания нажатий клавиш, я думаю я дико туплю, вот кусок кода,...

Как закрыть поток после вызова detach()? - C++
Всем здрасьте ! С join всё понятно, программа ждёт, когда завершится этот поток. Допустим я вызвал метод detach, как мне поток...

Потоки или коллбэки? - C++
Вопрос по структуре приложения. Потребовалось выполнение нескольких задач условно одновременно - выдавать звук в выходной поток и...

Потоки или FILE - C++
Здравствуйте. Делаю двумя способами открытие бинарного файла... int sizeFile; FILE *pointerFile = fopen(value, &quot;rb&quot;); if (...

14
nmcf
5542 / 4852 / 1645
Регистрация: 14.04.2014
Сообщений: 19,690
16.06.2016, 11:13 #2
Когда main() завершится, потоки будут принудительно завершены. Отсюда ошибки.
1
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
16.06.2016, 11:23 #3
Исключения кидают деструкторы t1 и t2.
0
nmcf
5542 / 4852 / 1645
Регистрация: 14.04.2014
Сообщений: 19,690
16.06.2016, 11:28 #4
Ilot, а detach() что даёт?
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
16.06.2016, 12:49 #5
Цитата Сообщение от nmcf Посмотреть сообщение
Ilot, а detach() что даёт?
Какой detach()? В коде его нет, поэтому и происходит ошибка.
В стандарте сказано:
If joinable() then terminate(), otherwise no effects. [ Note: Either implicitly detaching or joining
a joinable() thread in its destructor could result in difficult to debug correctness (for detach) or
performance (for join) bugs encountered only when an exception is raised. Thus the programmer must ensure that the destructor is never executed while the thread is still joinable. —end note ]
Деструкторы объектов std::thread будут вызывать terminate() если до его вызова (деструктора) не было принято решение о присоединении к потоку (join()) или отсоединению от него (detach()) т.е. если joinable() возвращает true.
0
nmcf
5542 / 4852 / 1645
Регистрация: 14.04.2014
Сообщений: 19,690
16.06.2016, 13:10 #6
Цитата Сообщение от Ilot Посмотреть сообщение
Какой detach()?
Вообще detach(). Какая польза от него?
0
avgoor
915 / 550 / 119
Регистрация: 05.12.2015
Сообщений: 1,531
16.06.2016, 13:19 #7
Цитата Сообщение от nmcf Посмотреть сообщение
Какая польза от него?
Ну, например у нас есть веб сервер, который должен исполняться вечно. При подключении он создает поток и отдает сокет ему. Что там дальше происходит - основному потоку не интересно. Поэтому можно отсоединиться от созданного потока и удалить std::thread.
0
nmcf
5542 / 4852 / 1645
Регистрация: 14.04.2014
Сообщений: 19,690
16.06.2016, 13:30 #8
avgoor, разве поток может существовать, если приложение закроется?
0
Knjagskij
-4 / 6 / 0
Регистрация: 10.11.2008
Сообщений: 775
Завершенные тесты: 1
16.06.2016, 13:31  [ТС] #9
Получается, что detach() всегда создает демонов?
0
nmcf
5542 / 4852 / 1645
Регистрация: 14.04.2014
Сообщений: 19,690
16.06.2016, 13:34 #10
detach() просто позволяет объект удалить судя по всему, а поток остаётся работать, если приложение не закрыть.
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
16.06.2016, 13:35 #11
Цитата Сообщение от nmcf Посмотреть сообщение
Вообще detach(). Какая польза от него?
Важно понимать, что объект thread не представляет собой поток, а управляет им. Т.е. можно спокойно передавать потоки между объектами thread как то пул потоков. В последнем случае вы можете запустить один поток и не ждать его завершения, а в тот же объект thread передать следующую задачу и т.д. Однако если не отсоединиться от потока то получим те же грабли:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <thread>
#include <iostream>
void hello() {
    std::cout << "hello\n";
}
int main () {
    std::thread t(hello);
    //t.detach();
    t = std::thread(hello);
    t.join();
    return 0;
}
0
Knjagskij
-4 / 6 / 0
Регистрация: 10.11.2008
Сообщений: 775
Завершенные тесты: 1
16.06.2016, 13:36  [ТС] #12
Цитата Сообщение от nmcf Посмотреть сообщение
Когда main() завершится, потоки будут принудительно завершены. Отсюда ошибки.
Но у меня 5 и 7 продолжают выводиться!
0
nmcf
5542 / 4852 / 1645
Регистрация: 14.04.2014
Сообщений: 19,690
16.06.2016, 13:38 #13
Как долго ты тестировал? Может система просто ждёт, пока приложение завершится.
0
avgoor
915 / 550 / 119
Регистрация: 05.12.2015
Сообщений: 1,531
16.06.2016, 13:49 #14
Цитата Сообщение от nmcf Посмотреть сообщение
avgoor, разве поток может существовать, если приложение закроется?
А оно не закрывается. Это служба, которая работает вечно. Как ее безопасно остановить - другой вопрос, и может оказаться, что в случае остановки легче всего просто забить на рабочие потоки.
0
Knjagskij
-4 / 6 / 0
Регистрация: 10.11.2008
Сообщений: 775
Завершенные тесты: 1
16.06.2016, 14:01  [ТС] #15
Цитата Сообщение от nmcf Посмотреть сообщение
Как долго ты тестировал? Может система просто ждёт, пока приложение завершится.
Функция выводит текст 50000 раз, все приложение работает пару-тройку секунд

Добавлено через 1 минуту
Увеличил до 500000, приложение работает пока не нажать на кнопку "Прервать" в сообщении об исключении
0
16.06.2016, 14:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2016, 14:01
Привет! Вот еще темы с ответами:

Хэндлы или потоки в C++11 - C++
Здравствуйте. Помогите новичку выполнить данную задачку на C++11: 1. Написать программу, которая выполняет следующие действия по...

Sqlite3, связь один ко многим, как ускорить выборку по ключу или правильно написать select. join - C++
вот так создается таблица: sqlite3_exec(db, &quot;CREATE TABLE IF NOT EXISTS lib (id INT PRIMARY KEY NOT NULL, lid INT, name CHAR, path...

Очередной по getline() или потоки ввода - C++
Всем привет! :drink: Ребятки, такая трабла, прога добавляет студентов в группу, при добавлении 2го студента ф-ция getline() непонятно для...

Файловые потоки типа wifstream и (или) wofstream неправильно работают - C++
Друзья! Есть двустрочный файл в кодировке UTF-16LE, нужно с него считать две строки и перегнать их в другой файл. В общем, копировать таким...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru