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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.65
aLarman
641 / 562 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
#1

Boost::thread vs std::thread - C++

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

Доброго времени суток, решил углубить свои знания, и решил почитать про потоки, бустовые и те что в 11 стандарте приняли, с бустом все ясно понятно, а вот стандартные меня ввели в ступор
например, (boost) создаем поток (он может быть бесконечным (внутри или вайл бесконечный или какие то блокирующие операции (пусть чтения с синхронного сокета))), у потока можно вызвать метод interrrupt т.е прервать поток, поток будет прерван в так называемой interruption point (их можно найти в описании) а вот стандартный поток вроде такого не имеет, или я не смог найти инфу - пытался читать на английском, мог что то упустить или непонять (уровень англ не ахти) кто то сможет разъяснить как работать с потоками в стандарте адэкватно, или как можно прервать выполнение потока безопасно
как пример (std c++11) пусть у нас есть мейн, и есть ф-ция котрую вызываем в отдельном потоке, в этой ф-ции стоит ну хоть recv для блокирующего сокета, и мы ничего не присылаем, тут программа заканчивается, как будет адэкватно организовать завершение потока ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.02.2014, 10:28     Boost::thread vs std::thread
Посмотрите здесь:

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

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

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

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

Многопоточность в C++11. std::thread - C++
Привет всем! использую таким образом многопоточность class A { public: void fun() { } };

Как убить std::thread? - C++
К сожалению мне так и не удалось найти информацию о том, как корректно убить std::thread в случае необходимости. Как правило, предлагают...

Присоединение потока std::thread - C++
Есть некая функция: int arr(){ do_something(); std::thread th1({ func1(); func2(); func3();}); th1.join() do_something2(); ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
THE--MASTER
Заблокирован
28.02.2014, 10:59     Boost::thread vs std::thread #2
WinApi используешь?
Обычно в потоке, которые не запускается единожды для какого - то вычисления, используют while с проверкой какого - то флага на break. Всякие Suspend - ы вообще не рекомендуется применять.
Что ты конкретно - то хотел сделать?
aLarman
641 / 562 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
28.02.2014, 11:04  [ТС]     Boost::thread vs std::thread #3
Цитата Сообщение от THE--MASTER Посмотреть сообщение
WinApi используешь?
нет я же говорю про std::thread и boost::thread
Цитата Сообщение от THE--MASTER Посмотреть сообщение
Всякие Suspend - ы вообще не рекомендуется применять.
одно дело не рекомендуется, а другое дело можно ли? а если можно то как правильно, что бы было адекватное завершение потоков
THE--MASTER
Заблокирован
28.02.2014, 11:10     Boost::thread vs std::thread #4
Цитата Сообщение от aLarman Посмотреть сообщение
что бы было адекватное завершение потоков
потоки адекватно завершаются после на выходе поточной функции. ты что хочешь сделать - то ?
aLarman
641 / 562 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
28.02.2014, 11:12  [ТС]     Boost::thread vs std::thread #5
Цитата Сообщение от THE--MASTER Посмотреть сообщение
на выходе поточной функции. ты что хочешь сделать - то ?
это понятно, а если выхода нет? или там был блокирующий вызов, и мы в это время завершаем исполнение главного потока, понятно дело можно сделать join() но тогда и главный поток может быть заблокирован
THE--MASTER
Заблокирован
28.02.2014, 11:15     Boost::thread vs std::thread #6
Цитата Сообщение от aLarman Посмотреть сообщение
и мы в это время завершаем исполнение главного потока
Если ты завершаешь выполнение главного потока и выходишь из программы (выход из main/ WinMain), тоесть закрываешь процесс, все его потоки автоматический завершатся некорректно с потерей данных
aLarman
641 / 562 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
28.02.2014, 11:17  [ТС]     Boost::thread vs std::thread #7
Цитата Сообщение от THE--MASTER Посмотреть сообщение
все его потоки автоматический завершатся некорректно с потерей данных
прекрасно, а как этого избежать?
THE--MASTER
Заблокирован
28.02.2014, 11:23     Boost::thread vs std::thread #8
Цитата Сообщение от aLarman Посмотреть сообщение
прекрасно, а как этого избежать?
смотри, я тебя правильно понимаю, что ты написал не корректный код внутри потоковой функции и хочешь принудительно kill thread с потерей данных, т.к. твоя функция зависла?
aLarman
641 / 562 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
28.02.2014, 11:30  [ТС]     Boost::thread vs std::thread #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
THE--MASTER
Заблокирован
28.02.2014, 11:31     Boost::thread vs std::thread #10
в потоковую функцию передавай указатель на какой - нибуть bool, и проверяй его на каждой итерации while
Цитата Сообщение от aLarman Посмотреть сообщение
//тут еще что то
здесь по мере надобности устанавливай флаг в сигнальное состояние и твой поток завершится корректно по выходу из функции
aLarman
641 / 562 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
28.02.2014, 11:41  [ТС]     Boost::thread vs std::thread #11
Цитата Сообщение от THE--MASTER Посмотреть сообщение
устанавливай флаг в сигнальное состояние
какой ?) я видимо мало про потоки знаю

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

Добавлено через 4 минуты
код покажи
aLarman
641 / 562 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
28.02.2014, 12:13  [ТС]     Boost::thread vs std::thread #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 тут такого нет
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
28.02.2014, 12:24     Boost::thread vs std::thread #14
Цитата Сообщение от aLarman Посмотреть сообщение
просто в boost точки слипа являются interruption point тут такого нет
Если у Вас блокируемый recv висит, то никакие interrupt point не помогут.
aLarman
641 / 562 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
28.02.2014, 12:42  [ТС]     Boost::thread vs std::thread #15
Tulosba, окей, а если беск.циклы то как? цикл делать зависимым от переменной , и в главном потоке ее изменять?
THE--MASTER
Заблокирован
28.02.2014, 12:43     Boost::thread vs std::thread #16
Цитата Сообщение от aLarman Посмотреть сообщение
цикл делать зависимым от переменной , и в главном потоке ее изменять?
конечно, я тебе об этом и говорю. А лучше, если под Windows - используй WinApi и его события, сообщения и пр
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
28.02.2014, 12:57     Boost::thread vs std::thread #17
Цитата Сообщение от aLarman Посмотреть сообщение
а если беск.циклы то как? цикл делать зависимым от переменной , и в главном потоке ее изменять?
В первом приближении, да. Не обязательно в главном, может быть и любой другой поток.
В более сложных ситуациях следует использовать т.н. условные переменные. В C++11 это например std::condition_variable.
aLarman
641 / 562 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
28.02.2014, 13:21  [ТС]     Boost::thread vs std::thread #18
Tulosba, благодарю

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

Добавлено через 1 минуту
Tulosba, и все таки как быть еще со сном (sleep)? получается дожидаться окончания сна в любом случае?
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
28.02.2014, 13:37     Boost::thread vs std::thread #19
Цитата Сообщение от aLarman Посмотреть сообщение
получается дожидаться окончания сна в любом случае?
http://en.cppreference.com/w/cpp/thr...ble/wait_until
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.02.2014, 19:55     Boost::thread vs std::thread
Еще ссылки по теме:

Std::thread приостановка потока - C++
Есть прога в C++ Builder. Три функции описаные внизу запускаются в трех разных потоках. Первый поток генерирует данные для для двух других,...

Копирование объектов std::thread - C++
В учебнике Энтони Уильямса есть простой пример класса scoped_thread, присоединяющего поток в деструкторе: class scoped_thread { ...

Запутался с std::thread в классе - C++
Гуру, помогите новичку! Учусь кодить в потоках! Немного разообрался. Теперь задача - "завернуть" поток в отдельный класс (внешний...

Std::thread автоматическая многопоточность - C++
Есть данный пример создания массива thread и инициализации его в цикле. #include<iostream> #include<sstream> #include<thread> ...

Std::thread как усыпить/ пробудить поток? - C++
Есть ли в std::thread возможность как - то приостановить поток, не разрушая его, а потом, по какому - то сигналу / прерыванию - возобновить...


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

Или воспользуйтесь поиском по форуму:
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.02.2014, 19:55     Boost::thread vs std::thread #20
Цитата Сообщение от aLarman Посмотреть сообщение
пытался читать на английском, мог что то упустить или непонять (уровень англ не ахти) кто то сможет разъяснить как работать с потоками в стандарте адэкватно
Энтони Уильямс "Параллельное программирование на С++ в действии". 2012.
Yandex
Объявления
28.02.2014, 19:55     Boost::thread vs std::thread
Ответ Создать тему
Опции темы

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