переменная-член класса std :: thread с непредвиденным поведением - PullRequest
3 голосов
/ 28 сентября 2019

Я ввел переменную-член std::thread в своем классе Request, который должен работать с подпрограммой в фоновом режиме.Процедура отправляет запрос, собирает данные и ждет короткое время, прежде чем повторить.После первой итерации процедуры другие переменные-члены объекта класса неожиданно меняются.

Раньше у меня была эта подпрограмма запроса без переменной-члена std :: thread.Когда я добавил переменную-член std :: thread, мне пришлось удалить функции-члены копирования и назначения копирования, потому что потоки не могут быть скопированы.

Даже когда комментирует функцию sendRequest и просто спит, запрособъект модифицируется.Я пробовал разные подходы к определению и инициализации члена класса std :: thread.

    class Request { 
    public:
        Request() = default;
        Request(/*args*/);
        Request(const Request&) = delete;
        Request& operator=(const Request&) = delete;
        Request(Request&&) = default;
        Request& operator=(Request&&) = default;
        ~Request();
        bool active = true;
    private:
        void start();
        void routine();
        void sendRequest();
        std::thread requestRoutine;
        std::chrono::seconds sleepinterval;
        //std::queue<std::vector<std::pair<Query, json::value>>> responseQueue;
    }

    Request::Request(/*args*/)
        : requestRoutine()
    {
        /*init member variables*/
        start();
    }

    void Request::start()
    {
        requestRoutine = std::thread(&Request::routine, this);
        requestRoutine.detach();
    }

    void Request::routine()
    {
        while (this->active) {
            sendRequest();
            std::this_thread::sleep_for(sleepinterval);
        }
    }

Я сократил класс до важных функций-членов и переменных.Если вам интересно, я использую cpprestsdk для отправки HTTP-запроса и получаю ответ HTTP с объектом JSON в теле.Для этого файла наиболее важны следующие операции:

#pragma once
#include <iostream>
#include <thread>
#include "boost/date_time/posix_time/posix_time.hpp"
#include "boost/date_time/gregorian/gregorian_types.hpp"
#include <cpprest/http_listener.h>
#include <cpprest/http_client.h>
#include <cpprest/json.h>
#include <cpprest/filestream.h>

Любая помощь и советы приветствуются.
Спасибо!

...