具有意外行为的std :: thread类成员变量

时间:2019-09-28 17:21:44

标签: c++ c++11 c++14

我在Request类中引入了一个std::thread成员变量,该变量应该在后台运行一个例程。该例程正在发送请求,收集数据并等待很短的时间再重复。例程的第一次迭代后,类对象的其他成员变量发生意外更改。

在没有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请求,并且我在正文中接收到带有JSON对象的HTTP响应。 此文件最多包含以下内容:

#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>

非常感谢您的帮助和建议。
谢谢!

0 个答案:

没有答案