Форум программистов, компьютерный форум CyberForum.ru

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

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

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

16.06.2016, 11:11. Просмотров 333. Ответов 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.06.2016, 11:11     Потоки без join() или detach()
Посмотрите здесь:

Поиск с барьером или без него C++
Есть два потока и глобальный массив, могут ли потоки перепутать элементы глобального массива или другого контейнера? C++
Использование Attach(HWND) и Detach() C++
C++ Строковые потоки. Преобразование типов (как сделать чтобы из строки число полностью преобразовывалось в double без потери чисел)
Потоки или коллбэки? C++
Потоки или FILE C++
C++ Хэндлы или потоки в C++11
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4487 / 3825 / 1290
Регистрация: 14.04.2014
Сообщений: 15,015
16.06.2016, 11:13     Потоки без join() или detach() #2
Когда main() завершится, потоки будут принудительно завершены. Отсюда ошибки.
Ilot
Модератор
Эксперт С++
1780 / 1155 / 223
Регистрация: 16.05.2013
Сообщений: 3,042
Записей в блоге: 5
Завершенные тесты: 1
16.06.2016, 11:23     Потоки без join() или detach() #3
Исключения кидают деструкторы t1 и t2.
nmcf
4487 / 3825 / 1290
Регистрация: 14.04.2014
Сообщений: 15,015
16.06.2016, 11:28     Потоки без join() или detach() #4
Ilot, а detach() что даёт?
Ilot
Модератор
Эксперт С++
1780 / 1155 / 223
Регистрация: 16.05.2013
Сообщений: 3,042
Записей в блоге: 5
Завершенные тесты: 1
16.06.2016, 12:49     Потоки без join() или detach() #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.
nmcf
4487 / 3825 / 1290
Регистрация: 14.04.2014
Сообщений: 15,015
16.06.2016, 13:10     Потоки без join() или detach() #6
Цитата Сообщение от Ilot Посмотреть сообщение
Какой detach()?
Вообще detach(). Какая польза от него?
avgoor
 Аватар для avgoor
786 / 428 / 93
Регистрация: 05.12.2015
Сообщений: 1,270
16.06.2016, 13:19     Потоки без join() или detach() #7
Цитата Сообщение от nmcf Посмотреть сообщение
Какая польза от него?
Ну, например у нас есть веб сервер, который должен исполняться вечно. При подключении он создает поток и отдает сокет ему. Что там дальше происходит - основному потоку не интересно. Поэтому можно отсоединиться от созданного потока и удалить std::thread.
nmcf
4487 / 3825 / 1290
Регистрация: 14.04.2014
Сообщений: 15,015
16.06.2016, 13:30     Потоки без join() или detach() #8
avgoor, разве поток может существовать, если приложение закроется?
Knjagskij
-4 / 6 / 0
Регистрация: 10.11.2008
Сообщений: 774
Завершенные тесты: 1
16.06.2016, 13:31  [ТС]     Потоки без join() или detach() #9
Получается, что detach() всегда создает демонов?
nmcf
4487 / 3825 / 1290
Регистрация: 14.04.2014
Сообщений: 15,015
16.06.2016, 13:34     Потоки без join() или detach() #10
detach() просто позволяет объект удалить судя по всему, а поток остаётся работать, если приложение не закрыть.
Ilot
Модератор
Эксперт С++
1780 / 1155 / 223
Регистрация: 16.05.2013
Сообщений: 3,042
Записей в блоге: 5
Завершенные тесты: 1
16.06.2016, 13:35     Потоки без join() или detach() #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;
}
Knjagskij
-4 / 6 / 0
Регистрация: 10.11.2008
Сообщений: 774
Завершенные тесты: 1
16.06.2016, 13:36  [ТС]     Потоки без join() или detach() #12
Цитата Сообщение от nmcf Посмотреть сообщение
Когда main() завершится, потоки будут принудительно завершены. Отсюда ошибки.
Но у меня 5 и 7 продолжают выводиться!
nmcf
4487 / 3825 / 1290
Регистрация: 14.04.2014
Сообщений: 15,015
16.06.2016, 13:38     Потоки без join() или detach() #13
Как долго ты тестировал? Может система просто ждёт, пока приложение завершится.
avgoor
 Аватар для avgoor
786 / 428 / 93
Регистрация: 05.12.2015
Сообщений: 1,270
16.06.2016, 13:49     Потоки без join() или detach() #14
Цитата Сообщение от nmcf Посмотреть сообщение
avgoor, разве поток может существовать, если приложение закроется?
А оно не закрывается. Это служба, которая работает вечно. Как ее безопасно остановить - другой вопрос, и может оказаться, что в случае остановки легче всего просто забить на рабочие потоки.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2016, 14:01     Потоки без join() или detach()
Еще ссылки по теме:

C++ Что такое потоки ввода, потоки вывода?
C++ Sqlite3, связь один ко многим, как ускорить выборку по ключу или правильно написать select. join
Как отделить поток с помощью detach? C++
C++ Std::thread::detach()
Как закрыть поток после вызова detach()? C++

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

Или воспользуйтесь поиском по форуму:
Knjagskij
-4 / 6 / 0
Регистрация: 10.11.2008
Сообщений: 774
Завершенные тесты: 1
16.06.2016, 14:01  [ТС]     Потоки без join() или detach() #15
Цитата Сообщение от nmcf Посмотреть сообщение
Как долго ты тестировал? Может система просто ждёт, пока приложение завершится.
Функция выводит текст 50000 раз, все приложение работает пару-тройку секунд

Добавлено через 1 минуту
Увеличил до 500000, приложение работает пока не нажать на кнопку "Прервать" в сообщении об исключении
Yandex
Объявления
16.06.2016, 14:01     Потоки без join() или detach()
Ответ Создать тему
Опции темы

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