C++中成员函数的std::thread

9
我正在尝试编写一个命令行服务器,它可以接收串口传来的信息,对其进行解析,并将其记录在内部对象中。
然后,在客户端的请求下,服务器会返回所请求的信息。
我想要做的是将接收器和解析器部分放在一个单独的线程中,以便让服务器在数据收集过程中不受干扰地运行。
#include <iostream>
#include <thread>

class exampleClass{
    std::thread *processThread;

    public void completeProcess(){
        while(1){
            processStep1();
            if (verification()){processStep2()}
        }
    };

    void processStep1(){...};
    void processStep2(){...};
    bool verification(){...};
    void runThreaded();
} // End example class definition

// The idea being that this thread runs independently
// until I call the object's destructor

exampleClass::runThreaded(){
    std::thread processThread(&exampleClass::completeProcess, this);
} // Unfortunately The program ends up crashing here with CIGARET

1
public void completeProcess() { .. 可以编译吗? - Deqing
可能是重复的问题,参考如何使用成员函数启动线程 - Ciro Santilli OurBigBook.com
2个回答

10

您正在一个成员函数中运行一个本地线程。您必须加入它或分离它,并且由于它是本地的,您必须在函数本身中执行此操作:

exampleClass::runThreaded()
{
    std::thread processThread(&exampleClass::completeProcess, this);
    // more stuff
    processThread.join();
} //

我猜你真正想要的是启动一个数据成员线程而不是启动一个本地线程。如果你这样做,仍然需要在某个地方加入它,例如在析构函数中。在这种情况下,你的方法应该是:

exampleClass::runThreaded()
{
    processThread = std::thread(&exampleClass::completeProcess, this);
}

和析构函数

exampleClass::~exampleClass()
{
    processThread.join();
}

processThread 应该是一个 std::thread,而不是一个指向它的指针。

关于设计的一点说明:如果要在线程数据成员上使用 runThreaded 方法,则必须非常小心,不能在线程加入之前调用它超过一次。在构造函数中启动线程,在析构函数中加入线程可能更有意义。


2

线程对象位于堆栈上,并且在函数结束时将被销毁。如果线程仍在运行,则线程对象的析构函数会调用 std::terminate,例如您的情况。请参见此处


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接