Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Остановка рабочей функции потока 
V
    Опции темы
cppGhost
Дата 8.8.2016, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 24.4.2013

Репутация: нет
Всего: нет



День добрый. Задумался над таким вот вопросом. Допустим, у меня есть две функции get(StopObj obj) и process(StopObj obj).
Эти две функции я запускаю из нескольких потоков. Сам StopObj obj это некий сигнал функциям, что работу стоит прервать. Делают ли так вообще? При этом достаточно ли в StopObj добавить флаг типа bool, по которому эти функции будут определять нужно ли преждевременно завершать работу? 
PM MAIL   Вверх
azesmcar
Дата 8.8.2016, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Делают. посмотри в .net например CancellationToken.
В одной функции делается так:
Код

while (!token.is_cancellation_requested())
{
    // do some work
}

в другой вызывается cancel
Код

token.cancel();


Добавлено через 4 минуты и 18 секунд
реализуется на обычном атомарном bool
PM   Вверх
cppGhost
Дата 8.8.2016, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 24.4.2013

Репутация: нет
Всего: нет



Ага. Единственное, я написал функции, куда передаётся объект по значению. Правильнее ведь, как я понимаю, передавать по ссылке?
PM MAIL   Вверх
azesmcar
Дата 8.8.2016, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



какой объект ? не совсем понял.

PM   Вверх
cppGhost
Дата 8.8.2016, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 24.4.2013

Репутация: нет
Всего: нет



Код

get(StopObj obj)

должно ведь быть
Код

get(StopObj &obj)


или наборот тут лучше по значению, чтобы исключить возможность изменения объекта в ходе выполнения функции?

Это сообщение отредактировал(а) cppGhost - 8.8.2016, 15:03
PM MAIL   Вверх
azesmcar
Дата 8.8.2016, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Тебе же нужно как раз, чтобы все функции разделяли этот объект. Если передать по значению, тогда вызов cancel() на одном из них, на состояние другого никак не повлияет.

Добавлено через 7 минут и 34 секунды
вот пример в примитивном виде.
Код

#include <iostream>
#include <thread>
#include <atomic>

class cancellation_token
{
public:
    cancellation_token()
        :cancellation_requested_(false)
    {
    }

    bool is_cancellation_requested() const
    {
        return cancellation_requested_.load(std::memory_order_acquire);
    }

    void cancel()
    {
        cancellation_requested_.store(true, std::memory_order_release);
    }
private:
    std::atomic_bool cancellation_requested_;
};

void process(cancellation_token& token)
{
    static int x = 0;
    while (!token.is_cancellation_requested())
    {
        std::cout << "x = " << ++x << std::endl;
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }
}

int main()
{
    cancellation_token token;
    std::thread th(process, std::ref(token));
    std::cin.get();
    token.cancel();
    th.join();
}

PM   Вверх
cppGhost
Дата 8.8.2016, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 24.4.2013

Репутация: нет
Всего: нет



Всё, понял. Большое спасибо
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1245 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.