2013-05-22 7 views
2

새 스레드를 처리해야하는 함수 만들기에 문제가 있습니다. 클래스 외부에서 만들면 모든 것이 올바르게 작동하지만 클래스 내부에서 만들고 싶을 때 호출 방법을 알 수 없습니다.C++에서 클래스 내의 스레드에 대한 함수

내가 가진 함수를 호출 :

pthread_t thread; 
pthread_create(&thread, NULL, 
     sendMessage, (void *) fd); 

및 함수 자체는 다음과 같습니다

void * sendMessage(void *threadid) { 
    string message; 
    const char * c; 
    char buffer[200]; 
    int fd = (long) threadid; 
    while (true) { 
     cin >> message; 

     if (message == "exit") { 
      break; 
     } 

     c = message.c_str(); 
     strncpy(buffer, c, sizeof (buffer)); 
     send(fd, buffer, strlen(buffer), 0); 
    } 
} 

을하지만 클래스, 예를 들어 내를 선언 할 때 void * Client::sendMessage(void *threadid), 내가 얻을 수 있기 때문에 나는 심지어 그것을 만들 수 없다 main.cpp:90:37: error: argument of type ‘void* (Client::)(void*)’ does not match ‘void* (*)(void*)’ 아무도 어떤 생각을 가지고 있습니까, 어떻게 그것을 고칠 수 있습니다?

+1

인가? 왜 처음에 수업에 넣었습니까? 필요한 경우 정적으로 만듭니다. – chris

+1

std :: thread를 사용하지 않는 특별한 이유가 있습니까? – sehe

+1

함수를 정적으로 만들거나 C++ 0X 스레딩 기능 – hetepeperfan

답변

4

그냥 std::thread 빠르게 모든 비애가 (끊김없이 std::bind 스타일의 호출과 통합) 사라지게 할 수있는 방법에 대한 간단한 데모 : 그것은 그냥 날 또는 당신이 어떤 데이터 멤버를 사용하지 않는

#include <string> 
#include <thread> 
#include <memory> 

void some_function(int i, std::string bla) 
{ 
} 

struct some_class 
{ 
    void some_member_function(double x) const 
    { 
    } 
}; 

int main() 
{ 
    std::thread t1(&some_function, 42, "the answer"); 
    std::thread t2; 

    { 
     some_class instance; 
     t2 = std::thread(&some_class::some_member_function, 
       std::ref(instance), 
       3.14159); 

     t2.join(); // need to join before `instance` goes out of scope 
    } 

    { 
     auto managed = std::make_shared<some_class>(); 
     t2 = std::thread([managed]() 
       { 
        managed->some_member_function(3.14159); 
       }); 

     // `managed` lives on 
    } 

    if (t1.joinable()) t1.join(); 
    if (t2.joinable()) t2.join(); 
} 
+0

pthread 대신 스레드를 사용하면 일부 클래스에서 일부 기능을 실행할 수 있습니까? 그것 자체 스레드에서? 당신의 모범에서 볼 수 있겠지만 확실하지는 않습니다. – Dworza

+1

예. 't2'를 보라. 두 가지 접근법을 보여 줬는데, 하나는'some_class' 인스턴스의 수명을 관리해야하고, 하나는 "마술처럼"당신을 위해서입니다. 관심있는 분들께 : http://coliru.stacked-crooked.com/view?id=25f0f3906d84a8ef97945d247e5a9842-c7de6e91a3d2775d02cca8b7bcb1b42c – sehe

관련 문제