[英]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.