2012-08-15 3 views
2

스레드를 지원하는 작은 임베디드 RTOS를 사용하고 있습니다. 나는 C++로 프로그래밍 중이며 스레드로 임의의 클래스의 임의의 멤버 함수를 실행할 수있는 클래스를 만들고 싶습니다. RTOS는 멤버 함수에서 쓰레드 생성을 직접적으로 지원하지 않지만 쓰래드에서 호출되면 잘 동작합니다. 부스트 :: 스레드는 내 플랫폼에서 사용할 수 없습니다.하우투 Boost없이 스레드로 C++ 멤버 함수를 실행 하시겠습니까?

현재 friend_starter() 함수를 통해 임의의 방식으로 스레드를 시작하지만 스레드를 실행할 각 클래스에 대해 별도의 스레드가 있어야합니다. 현재 스레드 기본 클래스의 현재 솔루션을 가상 run() 함수를 사용하지만이 단점은 클래스에 대한 하나의 스레드를 시작할 수 있으며 그 run() 함수 + 무엇을 차례로 호출하는 제한됩니다 (즉, 수 없습니다.) 우아하게) (실행 내에서 임의의 함수를 실행

나는 것 이상적 그래서이 클래스 "X"멤버 함수 내에서 다음을 수행 할 수 템플릿 된 클래스 "실"과 같은 :

class X 
{ 
    run_as_thread(void* p)'; 
}; 

X x; 
void* p = NULL; 

template<X> 
thread t(x, X::run_as_thread, p); 

//somehow causing the following to be run as a thread : 
x->run_as_thread(p); 

미안 미안하지만 전에 여기까지 죽어 버렸 습니다만, 부스트 :: 쓰레드를 사용하여이 일을 성취 할 수있는 참조를 찾을 수있을뿐입니다. 또한 힙에 액세스 할 수 없으므로 모든 전역 변수가 정적이어야합니다.

많은 감사,

마이크

+0

'클래스에 대한 1 개의 스레드 시작'- 클래스의 각 인스턴스에 대해 하나의 스레드를 의미합니까? 가상 run() 함수가 임베디드 작업에서 특히 제한적이라는 것을 알지 못합니다. 일반적으로 내 스레드는 영원히 실행되고 대기중인 메시지를 처리합니다. 메시지에는 열거 된 명령 등이 포함되어있어 스레드에게 수행 할 작업을 지시합니다. –

+0

오 - 내 의견을 잊어 버림 - '나는 또한 힙에 접근 할 수 없다'는 것을 눈치 챘다. 당신은 실제로 매우 제한되어 있습니다. 어떻게 물건을 얻을 수 있는지 모르겠다.

답변

2

컴파일러는 당신이 그것을 사용할 수있는 C++ (11) threading functionality을 지원하는만큼 현대적인 경우. 이 같은

아마 뭔가 :

class X 
{ 
public: 
    void run(void *p); 
}; 

X myX; 
void *p = nullptr; 

std::thread myThread(std::bind(&X::run, myX, p)); 

지금 X::run 스레드로 실행됩니다. 쓰레드가 뒤따라지면 std::thread::join으로 전화하십시오.

1

RTOS가 pthreads와 약간 비슷하다고 가정하고 C++ 11 (스레딩 지원에 대한 가정을하는 경우)을 사용하면 이러한 종류의 메커니즘을 사용할 수 있지만 클래스에 정적 메서드가 필요합니다 클래스의 인스턴스에 대한 포인터를 취합니다. 따라서 (대략)

class Wibble 
{ 
    public: 
    static void *run_pthread(void *me) 
    { 
     Wibble *x(static_cast<Wibble *>(me)); 
     return x->run_thread_code(); 
    } 
    private: 
    void *run_thread(); 
}; 

Wibble w; 
pthread_create(&thread, &attr, Wibble::run_pthread, &w); 

인수를 전달하는

는 노력의 비트와 함께 templatised 할 수 있지만, 그것은 용기가 작업해야 할 것입니다 방법은 ... 독자에게 연습으로 남아 있습니다.

0

비공식 프로젝트here에서 관련없는 클래스 간의 C++ 콜백을 에 전달하십시오.

0

그것은 당신이 비동기 적으로 클래스에 임의의 멤버 함수를 실행하는 방법입니다 묻는 것처럼 들리는데. 나는 가상 run() 기능에 대한 의견에서 그것을 가지고 :

당신이 좋아하지 않는 것을 의미하는

... "이 난 단지 클래스 1 개 스레드를 시작할 수있는 단점이있다" 이 옵션은 모든 함수 호출이 그 스레드에서 실행되도록하기 때문에, 원하는 것은 객체 지향 스레드 추상화를 작성하는 것이 아니라 개별 함수 호출을 스레드 오프하는 기능입니다.

대상 플랫폼에 대한 스레드 풀링 라이브러리를 조사해야합니다. 귀하의 실제 플랫폼이나 요구 사항에 대한 지식이 없으므로 구체적인 제안을 드릴 수는 없지만 그로 인해 검색 결과를 얻으실 수 있습니다.

+0

맞아, 내가 원하는 것은 지정된 멤버 함수가 스레드로 실행되는 것이다. 스레드 풀링을 사용할 수 없으며 컴파일러는 C++ 11을 준수합니다 :-( –