簡體   English   中英

C ++ std ::成員函數的線程

[英]C++ std::thread of a member function

我正在嘗試編寫一個命令行服務器,它將從串行端口接收信息,解析它,並將其記錄在內部對象中。

然后,根據客戶端的請求,服務器將返回所請求的信息。

我想要做的是將接收器和解析器部件放在一個單獨的線程中,以使服務器一起運行,而不是干擾數據收集。

#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

您正在成員函數中運行本地線程。 您必須加入或分離它,因為它是本地的,您必須在函數本身中執行此操作:

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方法作用於線程數據成員,則必須非常小心在連接線程之前不要多次調用它。 在構造函數中啟動線程並將其連接到析構函數中可能更有意義。

線程對象在堆棧上,它將在功能端被破壞。 如果線程仍在運行,則線程對象析構函數調用std::terminate ,如您的情況。 看到這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM