С++ std:: thread функции-члена

Я пытаюсь запрограммировать сервер командной строки, который будет получать информацию из последовательного порта, анализировать его и записывать во внутренний объект.

Затем по запросу от клиента сервер вернет запрошенную информацию.

Что я хочу сделать, это разместить части получателя и парсера в отдельном потоке, чтобы сервер работал вместе, не мешая сбору данных.

#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 destructor
exampleClass::runThreaded(){
 std::thread processThread(&exampleClass::completeProcess, this);
} // Unfortunately The program ends up crashing here with CIGARET
</thread></iostream>
2 ответа

Вы используете локальный поток внутри функции-члена. Вы должны присоединиться к нему или отделить его, и, поскольку он является локальным, вы должны сделать это в самой функции:

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, действующий на член данных потока, вы должны быть очень осторожны, чтобы не вызывать его более одного раза, прежде чем поток будет соединен. Может возникнуть смысл запустить поток в конструкторе и присоединиться к нему в деструкторе.


Объект Thread находится в стеке, и он будет разрушен на конце функции. Объект destructor объекта темы std::terminate, если поток все еще запущен, как в вашем случае. См. здесь.

licensed under cc by-sa 3.0 with attribution.