Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/30: Рейтинг темы: голосов - 30, средняя оценка - 4.73
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
1

Boost::thread vs std::thread

28.02.2014, 10:28. Показов 5931. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток, решил углубить свои знания, и решил почитать про потоки, бустовые и те что в 11 стандарте приняли, с бустом все ясно понятно, а вот стандартные меня ввели в ступор
например, (boost) создаем поток (он может быть бесконечным (внутри или вайл бесконечный или какие то блокирующие операции (пусть чтения с синхронного сокета))), у потока можно вызвать метод interrrupt т.е прервать поток, поток будет прерван в так называемой interruption point (их можно найти в описании) а вот стандартный поток вроде такого не имеет, или я не смог найти инфу - пытался читать на английском, мог что то упустить или непонять (уровень англ не ахти) кто то сможет разъяснить как работать с потоками в стандарте адэкватно, или как можно прервать выполнение потока безопасно
как пример (std c++11) пусть у нас есть мейн, и есть ф-ция котрую вызываем в отдельном потоке, в этой ф-ции стоит ну хоть recv для блокирующего сокета, и мы ничего не присылаем, тут программа заканчивается, как будет адэкватно организовать завершение потока ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.02.2014, 10:28
Ответы с готовыми решениями:

Boost::thread std::thread
чем отличается boost::thread( ) от std::thread (с++17)? я спрашиваю не о способе реализации...

Ошибка компиляции "no instance of constructor 'std::thread::thread' matches the argument list"
Не могу сообразить почему возникает ошибка. У меня в классе есть метод, который должен работать в...

Использование std::function в std::thread
Нужно вызвать function fnc в новом потоке. Как сделать? function <void(vector<char>)> fnc; void...

std::thread
Возник вопрос: как создать массив потоков (точнее, как его инициализировать). То есть, мне нужно...

19
Заблокирован
28.02.2014, 10:59 2
WinApi используешь?
Обычно в потоке, которые не запускается единожды для какого - то вычисления, используют while с проверкой какого - то флага на break. Всякие Suspend - ы вообще не рекомендуется применять.
Что ты конкретно - то хотел сделать?
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
28.02.2014, 11:04  [ТС] 3
Цитата Сообщение от THE--MASTER Посмотреть сообщение
WinApi используешь?
нет я же говорю про std::thread и boost::thread
Цитата Сообщение от THE--MASTER Посмотреть сообщение
Всякие Suspend - ы вообще не рекомендуется применять.
одно дело не рекомендуется, а другое дело можно ли? а если можно то как правильно, что бы было адекватное завершение потоков
0
Заблокирован
28.02.2014, 11:10 4
Цитата Сообщение от aLarman Посмотреть сообщение
что бы было адекватное завершение потоков
потоки адекватно завершаются после на выходе поточной функции. ты что хочешь сделать - то ?
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
28.02.2014, 11:12  [ТС] 5
Цитата Сообщение от THE--MASTER Посмотреть сообщение
на выходе поточной функции. ты что хочешь сделать - то ?
это понятно, а если выхода нет? или там был блокирующий вызов, и мы в это время завершаем исполнение главного потока, понятно дело можно сделать join() но тогда и главный поток может быть заблокирован
0
Заблокирован
28.02.2014, 11:15 6
Цитата Сообщение от aLarman Посмотреть сообщение
и мы в это время завершаем исполнение главного потока
Если ты завершаешь выполнение главного потока и выходишь из программы (выход из main/ WinMain), тоесть закрываешь процесс, все его потоки автоматический завершатся некорректно с потерей данных
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
28.02.2014, 11:17  [ТС] 7
Цитата Сообщение от THE--MASTER Посмотреть сообщение
все его потоки автоматический завершатся некорректно с потерей данных
прекрасно, а как этого избежать?
0
Заблокирован
28.02.2014, 11:23 8
Цитата Сообщение от aLarman Посмотреть сообщение
прекрасно, а как этого избежать?
смотри, я тебя правильно понимаю, что ты написал не корректный код внутри потоковой функции и хочешь принудительно kill thread с потерей данных, т.к. твоя функция зависла?
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
28.02.2014, 11:30  [ТС] 9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class X;
void Func()
{
X i;
while(1)
{
//do something
}
}
int main()
{
std::thread(Func);
//тут еще что то
return 0;
}
вот простой, пример, как поступить что бы поток правильно завершился?
если выполнить в такой интерпретации то деструктор объекта X i не вызывается

Добавлено через 1 минуту
даже вот так
Bash
1
2
terminate called without an active exception
Aborted
0
Заблокирован
28.02.2014, 11:31 10
в потоковую функцию передавай указатель на какой - нибуть bool, и проверяй его на каждой итерации while
Цитата Сообщение от aLarman Посмотреть сообщение
//тут еще что то
здесь по мере надобности устанавливай флаг в сигнальное состояние и твой поток завершится корректно по выходу из функции
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
28.02.2014, 11:41  [ТС] 11
Цитата Сообщение от THE--MASTER Посмотреть сообщение
устанавливай флаг в сигнальное состояние
какой ?) я видимо мало про потоки знаю

Добавлено через 8 минут
Цитата Сообщение от THE--MASTER Посмотреть сообщение
в потоковую функцию передавай указатель на какой - нибуть bool, и проверяй его на каждой итерации while
а ок, а если там будет блокирующий Вызов? в вайле пусть (хотя это и бред но мало ли) например recv блокирующего сокета
0
Заблокирован
28.02.2014, 11:50 12
Цитата Сообщение от aLarman Посмотреть сообщение
а если там будет блокирующий Вызов? в вайле пусть (хотя это и бред но мало ли) например recv блокирующего сокета
Значит у тебя логика софта не правильная, любой блокирующий вызов должен по таймеру разлочиваться, что говоришь у тебя там блокирует?

Добавлено через 4 минуты
код покажи
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
28.02.2014, 12:13  [ТС] 13
кода как такого нет, ну вот пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class X;
void Func()
{
X i;
int bytes = 0;
while(1)
{
bytes = recv(Socket, buf, sizeof(buf));//псевдокод, для этого метода нет таймаутов
}
}
int main()
{
std::thread(Func);
//тут еще что то
return 0;
}
или вместо recv будет sleep секунд на 10, и пока проуесс спит, главный завершает работу, просто в boost точки слипа являются interruption point тут такого нет
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
28.02.2014, 12:24 14
Цитата Сообщение от aLarman Посмотреть сообщение
просто в boost точки слипа являются interruption point тут такого нет
Если у Вас блокируемый recv висит, то никакие interrupt point не помогут.
2
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
28.02.2014, 12:42  [ТС] 15
Tulosba, окей, а если беск.циклы то как? цикл делать зависимым от переменной , и в главном потоке ее изменять?
0
Заблокирован
28.02.2014, 12:43 16
Цитата Сообщение от aLarman Посмотреть сообщение
цикл делать зависимым от переменной , и в главном потоке ее изменять?
конечно, я тебе об этом и говорю. А лучше, если под Windows - используй WinApi и его события, сообщения и пр
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
28.02.2014, 12:57 17
Цитата Сообщение от aLarman Посмотреть сообщение
а если беск.циклы то как? цикл делать зависимым от переменной , и в главном потоке ее изменять?
В первом приближении, да. Не обязательно в главном, может быть и любой другой поток.
В более сложных ситуациях следует использовать т.н. условные переменные. В C++11 это например std::condition_variable.
1
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
28.02.2014, 13:21  [ТС] 18
Tulosba, благодарю

Добавлено через 41 секунду
THE--MASTER, ну блин я собсно не про WinApi а про thread

Добавлено через 1 минуту
Tulosba, и все таки как быть еще со сном (sleep)? получается дожидаться окончания сна в любом случае?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
28.02.2014, 13:37 19
Цитата Сообщение от aLarman Посмотреть сообщение
получается дожидаться окончания сна в любом случае?
http://en.cppreference.com/w/c... wait_until
1
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
28.02.2014, 19:55 20
Цитата Сообщение от aLarman Посмотреть сообщение
пытался читать на английском, мог что то упустить или непонять (уровень англ не ахти) кто то сможет разъяснить как работать с потоками в стандарте адэкватно
Энтони Уильямс "Параллельное программирование на С++ в действии". 2012.
1
28.02.2014, 19:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.02.2014, 19:55
Помогаю со студенческими работами здесь

Std::thread в классе
Всем привет есть код #include<thread> #include<iostream> class SomeClass { public : ...

Конструктор std::thread
Доброго времени суток, помогите, пожалуйста, понять, в чем ошибка? #include <functional>...

Указатели и std::thread
Всем здрасьте ! Возникла проблема в понимании ... Возможно я написал не в ту тему, но думаю тут...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru