3

我打算编写一个std::cin在线程中读取并在输入内容时调用回调的类。回调是一个boost::function. 如果我只有 ,则代码运行std::getline (std::cin, command);,但如果我添加行,则会因“访问冲突”而崩溃if(this->m_receiveHandler != NULL)。我真的找不到发生了什么,所以我将问题简化为以下测试。

问题不是完全确定的,有时我可以输入一两行,有时它会立即崩溃。程序输出的最后一件事始终是“访问接收器处理程序”。

class InputReader
{
private:
    boost::function<void (const char*, unsigned int) > m_receiveHandler;
    boost::thread m_receiveThread;

    void receiveLoop(void)
    {

        while(true)
        {
            std::string command;
            std::getline (std::cin, command);
            std::cout << "access receiver handler" << std::flush;               
            if(this->m_receiveHandler != NULL)
            {
            }           
        }

    }

public:
    InputReader()
    {
        m_receiveThread = boost::thread(boost::bind(&InputReader::receiveLoop, this));
    }


};

TEST(InputReaderTest, WaitInfinite)
{
    InputReader reader;
    while (true) {};
}

你觉得这段代码有什么问题吗?

编辑:我在带有 Boost 1.49 的 Suse Linux 上使用 GCC 4.3.2 进行编译。

4

1 回答 1

1

我刚刚在 OSX 上用 clang 试过这个,它可以工作(虽然用 std 代替了 boost)。当您在不同的公共成员函数中启动线程时会发生什么?boost 函数变量实际上是两个线程之间的共享变量,应该受到一些并发原语的保护。线程实际上可能会看到“this”对象的不完整快照。它没有解释为什么它在失败之前工作了两次。如果您知道在构造时接收处理器将是什么并且您不需要更改它,您可以选择将 boost::function 作为参数传递给线程(复制甚至移动都可以)。

于 2013-04-17T10:11:48.153 回答