2012-10-02 58 views
2

通過論壇搜索後,我遇到了一些答案nevertheles我無法得到一個明確的答案如何在C++中的新線程中運行靜態方法。我主要關心的是啓動線程的最佳方法是什麼?(它是否也可以從另一個線程內部工作?) 哪個頭文件更適合使用? thread.h,pthread.h?如何在新線程中運行靜態函數?

我想創建一個新的線程(當一個給定的方法被調用時)並在這個線程內調用另一個函數... 任何提示我該如何解決這個問題?

非常感謝你們提前!

+0

這是操作系統特定的,或者至少它會是所有編譯器實現std :: thread之前。 (它是C++ 11的一部分)。你在使用哪種操作系統? – Benj

+0

看起來您應該從C++語言的基礎知識入手,以瞭解關鍵字「靜態」的含義。 –

+0

順便說一句,這裏的例子如何傳遞靜態成員線程與解釋http://stackoverflow.com/questions/7761527/passing-static-method-as-argument-no-address-of-operator-required –

回答

5

在線程中運行靜態成員函數沒有問題。只需使用std::thread的方式相同免提功能:

#include <thread> 

class Threaded 
{ 
public: 

    static void thread_func() {} 

}; 

int main() 
{ 
    std::thread t(Threaded::thread_func); 
    t.join(); 
    return 0; 
} 

當然,開始線程會從其他線程正常工作。使用符合C++ 11標準的編譯器時,應使用#include <thread>。否則看看boost::thread。它的用法很相似。

1

這樣做,這將是最好的方式OOPS: 定義一個切入點entryPoint()),它會調用一個成員函數myThreadproc())。入口點將啓動線程並致電myThreadproc。然後你可以訪問所有的成員變量和方法。

myClassA.h

class A 
{ 
    static void *entryPoint(void *arg); 
    void myThreadproc(); 
    void myfoo1(); 
    void myfoo2(); 
} 

myClassA.cpp

void *A::entryPoint(void *arg) 
{ 
    A *thisClass = (A *)arg; 
    thisClass-> myThreadproc(); 
} 

void A::myThreadproc() 
{ 
     //Now this function is running in the thread.. 
     myfoo1(); 
     myfoo2(); 
} 

現在可以創建線程這樣的:

int main() 
{ 
    pthread_t thread_id; 
    pthread_create(&thread_id,NULL,(A::entryPoint),new A()); 
    //Wait for the thread 
    return 0; 
} 
+0

'答: :entryPoint'需要返回'void *'。 – Tudor

+0

thanks .. edited .. – user739711

+0

我想你想在'entryPoint'中調用'myThreadproc',對吧? – Tudor

2

假設例如您的靜態函數有兩個參數:

#include <boost/thread/thread.hpp> 

void launchThread() 
{ 
    boost::thread t(&MyClass::MyStaticFunction, arg1, arg2); 
} 

這將需要鏈接到Boost.Thread庫。

相關問題