654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
|
|
1 | |
Boost::thread vs std::thread28.02.2014, 10:28. Показов 5931. Ответов 19
Метки нет (Все метки)
Доброго времени суток, решил углубить свои знания, и решил почитать про потоки, бустовые и те что в 11 стандарте приняли, с бустом все ясно понятно, а вот стандартные меня ввели в ступор
например, (boost) создаем поток (он может быть бесконечным (внутри или вайл бесконечный или какие то блокирующие операции (пусть чтения с синхронного сокета))), у потока можно вызвать метод interrrupt т.е прервать поток, поток будет прерван в так называемой interruption point (их можно найти в описании) а вот стандартный поток вроде такого не имеет, или я не смог найти инфу - пытался читать на английском, мог что то упустить или непонять (уровень англ не ахти) кто то сможет разъяснить как работать с потоками в стандарте адэкватно, или как можно прервать выполнение потока безопасно как пример (std c++11) пусть у нас есть мейн, и есть ф-ция котрую вызываем в отдельном потоке, в этой ф-ции стоит ну хоть recv для блокирующего сокета, и мы ничего не присылаем, тут программа заканчивается, как будет адэкватно организовать завершение потока ?
0
|
28.02.2014, 10:28 | |
Ответы с готовыми решениями:
19
Boost::thread std::thread Ошибка компиляции "no instance of constructor 'std::thread::thread' matches the argument list" Использование std::function в std::thread std::thread |
Заблокирован
|
|
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 |
нет я же говорю про std::thread и boost::thread
одно дело не рекомендуется, а другое дело можно ли? а если можно то как правильно, что бы было адекватное завершение потоков
0
|
Заблокирован
|
|
28.02.2014, 11:10 | 4 |
потоки адекватно завершаются после на выходе поточной функции. ты что хочешь сделать - то ?
0
|
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
|
|
28.02.2014, 11:12 [ТС] | 5 |
это понятно, а если выхода нет? или там был блокирующий вызов, и мы в это время завершаем исполнение главного потока, понятно дело можно сделать join() но тогда и главный поток может быть заблокирован
0
|
Заблокирован
|
|
28.02.2014, 11:15 | 6 |
Если ты завершаешь выполнение главного потока и выходишь из программы (выход из main/ WinMain), тоесть закрываешь процесс, все его потоки автоматический завершатся некорректно с потерей данных
0
|
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
|
|
28.02.2014, 11:17 [ТС] | 7 |
0
|
Заблокирован
|
|
28.02.2014, 11:23 | 8 |
смотри, я тебя правильно понимаю, что ты написал не корректный код внутри потоковой функции и хочешь принудительно kill thread с потерей данных, т.к. твоя функция зависла?
0
|
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
|
|||||||||||
28.02.2014, 11:30 [ТС] | 9 | ||||||||||
если выполнить в такой интерпретации то деструктор объекта X i не вызывается Добавлено через 1 минуту даже вот так
0
|
Заблокирован
|
|
28.02.2014, 11:31 | 10 |
в потоковую функцию передавай указатель на какой - нибуть bool, и проверяй его на каждой итерации while
здесь по мере надобности устанавливай флаг в сигнальное состояние и твой поток завершится корректно по выходу из функции
0
|
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
|
|
28.02.2014, 11:41 [ТС] | 11 |
какой ?) я видимо мало про потоки знаю
Добавлено через 8 минут а ок, а если там будет блокирующий Вызов? в вайле пусть (хотя это и бред но мало ли) например recv блокирующего сокета
0
|
Заблокирован
|
|
28.02.2014, 11:50 | 12 |
Значит у тебя логика софта не правильная, любой блокирующий вызов должен по таймеру разлочиваться, что говоришь у тебя там блокирует?
Добавлено через 4 минуты код покажи
0
|
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
|
||||||
28.02.2014, 12:13 [ТС] | 13 | |||||
кода как такого нет, ну вот пример
0
|
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
|
|
28.02.2014, 12:42 [ТС] | 15 |
Tulosba, окей, а если беск.циклы то как? цикл делать зависимым от переменной , и в главном потоке ее изменять?
0
|
Заблокирован
|
|
28.02.2014, 12:43 | 16 |
конечно, я тебе об этом и говорю. А лучше, если под Windows - используй WinApi и его события, сообщения и пр
1
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
|
28.02.2014, 12:57 | 17 |
В первом приближении, да. Не обязательно в главном, может быть и любой другой поток.
В более сложных ситуациях следует использовать т.н. условные переменные. В 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 |
1
|
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|
28.02.2014, 19:55 | 20 |
1
|
28.02.2014, 19:55 | |
28.02.2014, 19:55 | |
Помогаю со студенческими работами здесь
20
Std::thread в классе Конструктор std::thread Указатели и std::thread Std::thread::detach() Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |