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

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

Восстановить пароль Регистрация
 
Knjagskij
-4 / 6 / 0
Регистрация: 10.11.2008
Сообщений: 772
Завершенные тесты: 1
16.06.2016, 11:11     Потоки без join() или detach() #1
Почему такой код выводит данные в консоль, не смотря на выбрасывание исключения?

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
4314 / 3735 / 1260
Регистрация: 14.04.2014
Сообщений: 14,640
16.06.2016, 11:13     Потоки без join() или detach() #2
Когда main() завершится, потоки будут принудительно завершены. Отсюда ошибки.
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
16.06.2016, 11:23     Потоки без join() или detach() #3
Исключения кидают деструкторы t1 и t2.
nmcf
4314 / 3735 / 1260
Регистрация: 14.04.2014
Сообщений: 14,640
16.06.2016, 11:28     Потоки без join() или detach() #4
Ilot, а detach() что даёт?
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 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
4314 / 3735 / 1260
Регистрация: 14.04.2014
Сообщений: 14,640
16.06.2016, 13:10     Потоки без join() или detach() #6
Цитата Сообщение от Ilot Посмотреть сообщение
Какой detach()?
Вообще detach(). Какая польза от него?
avgoor
562 / 352 / 83
Регистрация: 05.12.2015
Сообщений: 1,137
16.06.2016, 13:19     Потоки без join() или detach() #7
Цитата Сообщение от nmcf Посмотреть сообщение
Какая польза от него?
Ну, например у нас есть веб сервер, который должен исполняться вечно. При подключении он создает поток и отдает сокет ему. Что там дальше происходит - основному потоку не интересно. Поэтому можно отсоединиться от созданного потока и удалить std::thread.
nmcf
4314 / 3735 / 1260
Регистрация: 14.04.2014
Сообщений: 14,640
16.06.2016, 13:30     Потоки без join() или detach() #8
avgoor, разве поток может существовать, если приложение закроется?
Knjagskij
-4 / 6 / 0
Регистрация: 10.11.2008
Сообщений: 772
Завершенные тесты: 1
16.06.2016, 13:31  [ТС]     Потоки без join() или detach() #9
Получается, что detach() всегда создает демонов?
nmcf
4314 / 3735 / 1260
Регистрация: 14.04.2014
Сообщений: 14,640
16.06.2016, 13:34     Потоки без join() или detach() #10
detach() просто позволяет объект удалить судя по всему, а поток остаётся работать, если приложение не закрыть.
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 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
Сообщений: 772
Завершенные тесты: 1
16.06.2016, 13:36  [ТС]     Потоки без join() или detach() #12
Цитата Сообщение от nmcf Посмотреть сообщение
Когда main() завершится, потоки будут принудительно завершены. Отсюда ошибки.
Но у меня 5 и 7 продолжают выводиться!
nmcf
4314 / 3735 / 1260
Регистрация: 14.04.2014
Сообщений: 14,640
16.06.2016, 13:38     Потоки без join() или detach() #13
Как долго ты тестировал? Может система просто ждёт, пока приложение завершится.
avgoor
562 / 352 / 83
Регистрация: 05.12.2015
Сообщений: 1,137
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++

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

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

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

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