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

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

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

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

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

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

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

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

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

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

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

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

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

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

Добавлено через 4 минуты
код покажи
0
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
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
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
28.02.2014, 12:24 #14
Цитата Сообщение от aLarman Посмотреть сообщение
просто в boost точки слипа являются interruption point тут такого нет
Если у Вас блокируемый recv висит, то никакие interrupt point не помогут.
2
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
28.02.2014, 12:42  [ТС] #15
Tulosba, окей, а если беск.циклы то как? цикл делать зависимым от переменной , и в главном потоке ее изменять?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.02.2014, 12:42
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
28.02.2014, 12:42
Ответ Создать тему
Опции темы

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