具有单独线程的程序被杀死

时间:2019-04-10 09:45:45

标签: c++

在我的main中声明一个对象并在单独的线程中运行它的功能后,我的程序崩溃。

我已经阅读了关于SO的其他问题,但是由于我缺乏多线程知识,所以我无法理解具体的问题。

这是我的类,称为UART(不包含头文件,仅显示所需的cpp声明):

$(document).on('turbolinks:load',function(){...})

我的主要cpp看起来像这样:

void UART::run()
    {
        while(true)
        {
            _letter = _serial.read();
            if (_letter == "!")
            {
                _line = _serial.readline();
                _words.clear();
                std::istringstream f(_line);
                std::string s;
                //std::cout << _letter << std::endl;
                while (getline(f,s,'\t'))
                {
                    _words.push_back(s);
                }
                this->fillVars();
            }
        }
    }

    void UART::fillVars()
    {
        if (_words[0] == "s")
        {
            _effort[0] = std::stoi(_words[1]);
            _effort[1] = std::stoi(_words[2]);
        }
        else if (_words[0] == "e")
        {
            this->convertToMeters();
        }

    }

    void UART::convertToMeters()
    {
        std::cout << _position[0];
        _position[0] = std::stod(_words[1]); // / _tick_meters;
        _position[1] = std::stod(_words[2]) / _tick_meters;
    }


    double UART::getPosition(std::string wheel)
    {
        if (wheel == "LEFT") return _position[0];
        else return _position[1];
    }

我的理解是,创建对象int main(int argc, char** argv) { ros::init(argc, argv, "joint_node"); std::string port("/dev/ttyACM0"); unsigned long baud = 115200; try { serial::Serial my_serial(port, baud, serial::Timeout::simpleTimeout(1000)); if(my_serial.isOpen()) ROS_INFO("Serial is %s", "open"); genius::UART uart(my_serial, 380); std::thread uart_run(&genius::UART::run, uart); std::cout << uart.getPosition("LEFT") <<std::endl; } catch (std::exception &e) { std::cerr << "Unhandled Exception: " << e.what() << std::endl; } return 0; } 之后,我希望在单独的线程中运行其功能uart,因为我希望其值在后台不中断的情况下进行更新。因此,每当像使用其函数run()一样访问其值时,我都会获取最新的数据。我猜我不需要uart.getPosition("LEFT")这个线程,因为我不想等待它,因为它永远不会结束。

但是由于某种原因,在调用.join()之后,我的程序崩溃了,函数uart.getPosition("LEFT")也从未执行过,并且我总是得到0值。

0 个答案:

没有答案