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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.65
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
28.02.2014, 10:28     Boost::thread vs std::thread #1
Доброго времени суток, решил углубить свои знания, и решил почитать про потоки, бустовые и те что в 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
Посмотрите здесь:

C++ std::thread
Как убить std::thread? C++
Многопоточность в C++11. std::thread C++
Ошибка при создании потока std::thread C++
C++ Std::thread, создать указатель на член класса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
THE--MASTER
Заблокирован
28.02.2014, 10:59     Boost::thread vs std::thread #2
WinApi используешь?
Обычно в потоке, которые не запускается единожды для какого - то вычисления, используют while с проверкой какого - то флага на break. Всякие Suspend - ы вообще не рекомендуется применять.
Что ты конкретно - то хотел сделать?
aLarman
636 / 557 / 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
636 / 557 / 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
636 / 557 / 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
636 / 557 / 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
636 / 557 / 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
636 / 557 / 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
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
28.02.2014, 12:24     Boost::thread vs std::thread #14
Цитата Сообщение от aLarman Посмотреть сообщение
просто в boost точки слипа являются interruption point тут такого нет
Если у Вас блокируемый recv висит, то никакие interrupt point не помогут.
aLarman
636 / 557 / 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
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
28.02.2014, 12:57     Boost::thread vs std::thread #17
Цитата Сообщение от aLarman Посмотреть сообщение
а если беск.циклы то как? цикл делать зависимым от переменной , и в главном потоке ее изменять?
В первом приближении, да. Не обязательно в главном, может быть и любой другой поток.
В более сложных ситуациях следует использовать т.н. условные переменные. В C++11 это например std::condition_variable.
aLarman
636 / 557 / 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
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
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++ Std::thread автоматическая многопоточность
C++ Запутался с std::thread в классе

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 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
Ответ Создать тему
Опции темы

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