2013-08-22 58 views
6

Tôi đang cố gắng lập trình một máy chủ dòng lệnh để nhận thông tin từ cổng nối tiếp, phân tích cú pháp và ghi lại nó trong một đối tượng bên trong.C++ std :: thread của hàm thành viên

Sau đó, theo yêu cầu từ khách hàng, máy chủ sẽ trả lại thông tin được yêu cầu.

Điều tôi muốn làm là đặt người nhận & các bộ phận phân tích cú pháp trong một chuỗi riêng biệt để máy chủ chạy dọc theo bên, không can thiệp vào việc thu thập dữ liệu.

#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

Có thể biên dịch 'public void completeProcess() {..'? – Deqing

+0

Có thể trùng lặp của [Bắt đầu chuỗi với chức năng thành viên] (http://stackoverflow.com/questions/10673585/start-thread-with-member-function) –

Trả lời

8

Bạn đang chạy một chủ đề cục bộ bên trong chức năng thành viên. Bạn phải tham gia hay tách nó và, vì nó là địa phương, bạn phải làm điều này trong hàm chính nó:

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

Tôi đoán những gì bạn thực sự muốn là để khởi động một sợi thành viên dữ liệu thay vì tung ra một địa phương. Nếu bạn làm điều này, bạn vẫn phải tham gia nó ở đâu đó, ví dụ như trong destructor. Trong trường hợp này, phương pháp của bạn nên được

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

và destructor

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

processThread phải là một std::thread, không phải là một con trỏ đến một.

Chỉ cần lưu ý về thiết kế: nếu bạn có phương thức runThreaded hoạt động trên thành viên dữ liệu chuỗi, bạn phải rất cẩn thận khi không gọi nhiều hơn một lần trước khi chuỗi được nối. Nó có thể có ý nghĩa hơn để khởi chạy thread trong constructor và kết hợp nó trong destructor.

+0

Đó (ý tưởng thứ hai) là nó, cảm ơn! – Torrijos

3

Đối tượng chủ đề nằm trên ngăn xếp và nó sẽ bị hủy trên đầu chức năng. Thread destructor object gọi std::terminate nếu thread vẫn chạy, như trong trường hợp của bạn. Xem here.

Các vấn đề liên quan