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

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

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

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

16.06.2016, 11:11. Просмотров 591. Ответов 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
5267 / 4587 / 1538
Регистрация: 14.04.2014
Сообщений: 18,220
16.06.2016, 11:13     Потоки без join() или detach() #2
Когда main() завершится, потоки будут принудительно завершены. Отсюда ошибки.
Ilot
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
16.06.2016, 11:23     Потоки без join() или detach() #3
Исключения кидают деструкторы t1 и t2.
nmcf
5267 / 4587 / 1538
Регистрация: 14.04.2014
Сообщений: 18,220
16.06.2016, 11:28     Потоки без join() или detach() #4
Ilot, а detach() что даёт?
Ilot
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 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
5267 / 4587 / 1538
Регистрация: 14.04.2014
Сообщений: 18,220
16.06.2016, 13:10     Потоки без join() или detach() #6
Цитата Сообщение от Ilot Посмотреть сообщение
Какой detach()?
Вообще detach(). Какая польза от него?
avgoor
884 / 519 / 112
Регистрация: 05.12.2015
Сообщений: 1,464
16.06.2016, 13:19     Потоки без join() или detach() #7
Цитата Сообщение от nmcf Посмотреть сообщение
Какая польза от него?
Ну, например у нас есть веб сервер, который должен исполняться вечно. При подключении он создает поток и отдает сокет ему. Что там дальше происходит - основному потоку не интересно. Поэтому можно отсоединиться от созданного потока и удалить std::thread.
nmcf
5267 / 4587 / 1538
Регистрация: 14.04.2014
Сообщений: 18,220
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
5267 / 4587 / 1538
Регистрация: 14.04.2014
Сообщений: 18,220
16.06.2016, 13:34     Потоки без join() или detach() #10
detach() просто позволяет объект удалить судя по всему, а поток остаётся работать, если приложение не закрыть.
Ilot
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 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
5267 / 4587 / 1538
Регистрация: 14.04.2014
Сообщений: 18,220
16.06.2016, 13:38     Потоки без join() или detach() #13
Как долго ты тестировал? Может система просто ждёт, пока приложение завершится.
avgoor
884 / 519 / 112
Регистрация: 05.12.2015
Сообщений: 1,464
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++ Sqlite3, связь один ко многим, как ускорить выборку по ключу или правильно написать select. join
C++ Файловые потоки типа wifstream и (или) wofstream неправильно работают
C++ Строковые потоки. Преобразование типов (как сделать чтобы из строки число полностью преобразовывалось в double без потери чисел)
C++ Что такое потоки ввода, потоки вывода?
Есть два потока и глобальный массив, могут ли потоки перепутать элементы глобального массива или другого контейнера? 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()
Ответ Создать тему
Опции темы

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