12 / 12 / 8
Регистрация: 27.12.2012
Сообщений: 448
1

Как правильно использовать thread?

09.12.2016, 12:03. Показов 1863. Ответов 9
Метки нет (Все метки)

Не могу понять как удалить поток thread во время его выполнения. То есть у меня есть поток в которым зацикливание (ниже в коду увидите) и в один момент я хочу, чтобы он просто перестал работать, исчез, удалился. Я прочёл документацию, просмотрел лекции от технопарка, но именно с thread (ООП/C++) не понял как сделать. В процедурной версии thread есть такая функция, типа pthread_cancel(/* params */). Вот она выполняет это действие, которое мне нужно (ну там ещё нужно в потоке поставить метки, в которых он может завершиться). Был вариант создать атомики (std::atomic), которые завершали б работу потока, но это всё-таки не то, что мне нужно. Можете помочь?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include<iostream>
#include <Windows.h>
#include <thread>
using namespace std;
 
void preloader();
 
void main()
{
    // Запуск потока
    thread preload(preloader);
 
    // Некие действия, например загрузка данных
    // но пускай будет sleep
    Sleep(2000);
 
    // Вот здесь хочу удалить этот поток
    // вызвать что-то типа preload.cancel();
    preload.detach();
    preload.~thread();
 
    system("cls");
    system("pause");
}
 
void preloader()
{
    while (true) {
        system("cls");
 
        cout << "Loading .";
        Sleep(200);
 
        cout << '.';
        Sleep(200);
 
        cout << '.';
        Sleep(200);
    }
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.12.2016, 12:03
Ответы с готовыми решениями:

Как правильно передать указатель на структуру, и правильно ее использовать
Я планирую сделать сортировку, но компилятор начал ругаться &quot;Нет существует подходящей функции...

Как правильно использовать map?
Свой код писал по примеру cut. Вот, что есть, и показываю скрин екхепшана, который...

Как использовать правильно потоки
У меня есть нечто рода void DiscordJob::SendMessageThread(const char *chanel, const char...

Как правильно использовать цикл?
Задача с экспонентами. Нужно найти следующее:...

9
Падаван С++
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
09.12.2016, 12:07 2
triadec_96, после использования детач, вы не имеете никакого контроля над потоком, да в чем проблемма, если загрузка данных, допустим файл, то файл закончился и вышли из потока цикла

Добавлено через 1 минуту
triadec_96, ну или сделать общую для 2х потоков переменную, типа бул, которую если мы поменяем в мейне, то остановим поток
1
12 / 12 / 8
Регистрация: 27.12.2012
Сообщений: 448
09.12.2016, 12:14  [ТС] 3
Цитата Сообщение от obivan Посмотреть сообщение
ну или сделать общую для 2х потоков переменную, типа бул, которую если мы поменяем в мейне, то остановим поток
Это и есть атомик. Но ведь при таком подходе понижается уровень абстракции. Работа потока завершается на процедурном уровне, при какой-то проверке в коде, а не на уровне ООП при явном вызове метода объекта.

Добавлено через 1 минуту
Цитата Сообщение от obivan Посмотреть сообщение
да в чем проблемма, если загрузка данных, допустим файл, то файл закончился и вышли из потока цикла
Но ведь я хочу, чтобы загрузка файла и отображение прелоадера выполнялись на разных потоках одновременно. Или я неправильно Вас понял?
0
Падаван С++
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
09.12.2016, 12:18 4
Лучший ответ Сообщение было отмечено triadec_96 как решение

Решение

triadec_96, но в тоже время, если то как вы хотите, нарушает консепции много поточности, поток чтения, должен сам заниматся чтением и решать когда его остановить а когда нет
Цитата Сообщение от triadec_96 Посмотреть сообщение
Это и есть атомик
прошу прощения, не дочитал тогда ваш пост до конца

Добавлено через 3 минуты
triadec_96, просто проблемма в том, что thread не поддерживает функцию остановки потоков, в данном случае может лучше воспользоватся boost::thread
1
12 / 12 / 8
Регистрация: 27.12.2012
Сообщений: 448
09.12.2016, 12:21  [ТС] 5
Цитата Сообщение от obivan Посмотреть сообщение
в том, что thread не поддерживает функцию остановки потоков
Спасибо, это и хотел узнать. Просто странно, что процедурная версия поддерживает, а ООП-я - нет. А boost кроссплатформенный?
0
Падаван С++
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
09.12.2016, 12:23 6
triadec_96, лично по мне, использовать атомик для синхронизации, норм ооп и процедурное программирование в плюсах идут под ручку, а не порозень

Добавлено через 45 секунд
Цитата Сообщение от triadec_96 Посмотреть сообщение
А boost кроссплатформенный
угу
0
7166 / 6141 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
09.12.2016, 12:27 7
triadec_96, в как ты вообще остановку извне без ведома потока представляешь? Алгоритм может прерваться в самом неподходящем месте.
0
12 / 12 / 8
Регистрация: 27.12.2012
Сообщений: 448
09.12.2016, 12:30  [ТС] 8
Цитата Сообщение от nmcf Посмотреть сообщение
как ты вообще остановку извне без ведома потока представляешь?
Представляю созданием меток в этом потоке, на которых проверяется был ли отправлен в этот поток запрос на его приостановление/удаление.

Добавлено через 28 секунд
Цитата Сообщение от nmcf Посмотреть сообщение
Алгоритм может прерваться в самом неподходящем месте.
В моём алгоритме (preloader) таких мест нету.
0
7166 / 6141 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
09.12.2016, 12:41 9
Цитата Сообщение от triadec_96 Посмотреть сообщение
Представляю созданием меток в этом потоке, на которых проверяется был ли отправлен в этот поток запрос на его приостановление/удаление.
Использование atomic, описанное выше, и реализует такую модель.
Цитата Сообщение от triadec_96 Посмотреть сообщение
В моём алгоритме (preloader) таких мест нету.
А ты думаешь, что принудительно прерваться может только на операторах C++, а если внтури?
1
Don't worry, be happy
17758 / 10526 / 2030
Регистрация: 27.09.2012
Сообщений: 26,502
Записей в блоге: 1
09.12.2016, 18:04 10
Цитата Сообщение от triadec_96 Посмотреть сообщение
таких мест нету.
Вот пример: Потоки, списки и непонятное зависание программы
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.12.2016, 18:04
Помогаю со студенческими работами здесь

Как правильно использовать struct?
Написал небольшую, глупенькую программку, но столкнулся с проблемой заполнения структуры. Если...

Как правильно использовать потоки?
Тему про потоки прочёл. Так же ознакомился с классом mutex. И вот есть некий вопрос: как правильно...

Как правильно использовать оператор else?
Подскажите пожалуйста, как правильно применить оператор else в задаче...у меня она не работает,...

Как правильно использовать cin.get?
cin.get и cin.getline - одно и то же? Мне нужно задание полностью с указателями сделать, но я не...

Как правильно использовать несколько файлов
Доброе время суток, появилась необходимость разбить программу на несколько файлов в которых...

Как правильно вызвать метод в С++ и как использовать команду goto в default
#include &lt;iostream&gt;; #include &lt;conio.h&gt;; using namespace std; void main() {...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru