2013-08-22 5 views
6

Я пытаюсь запрограммировать сервер командной строки, который будет получать информацию из последовательного порта, анализировать его и записывать во внутренний объект.C++ 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's destructor 

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

Может ли 'public void completeProcess() {..' быть скомпилирован? – Deqing

+0

Возможный дубликат [Начать тему с помощью функции-члена] (http://stackoverflow.com/questions/10673585/start-thread-with-member-function) –

ответ

8

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

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

+0

Это (вторая идея) было, спасибо! – Torrijos

3

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

Смежные вопросы