2013-08-22 29 views
-1

我正在.NET中創建可以在服務器端使用的應用程序。我的應用程序也有C++部分。在一個C++類中,我需要創建一個應該貫穿對象生命週期的線程。 我正在使用CreateThread函數來創建新的線程。創建線程的非靜態函數

問題是,它需要一個靜態函數作爲運行線程的參數。因爲我想在服務器端部署它,所以我不想使用靜態函數來用於線程。我想使用該方法的對象的成員函數。

有沒有更好的方式來創建線程

回答

2

你不能一個成員函數指針傳遞給CreateThread,但你可以通過它轉發到成員函數非成員函數。

您可以將參數傳遞給CreateThread,傳遞給您的函數。使用此從中穿過你的類的實例:,

struct foo 
{ 
    void thread_func(); 

    static DWORD CALLBACK thread_func_thunk(void *arg) 
    { 
     ((foo*)arg)->thread_func(); 
    } 
}; 

foo fooinst; 
CreateThread(nullptr, 0, foo::thread_func_thunk, (void*)&fooinst, 0, nullptr) 
+0

+1儘管「thread_func_thunk」 :)富可以是抽象的,那麼你就可以在你的產業鏈添加富,實現thread_func()你想怎麼,雖然你應該把它稱爲'任務',或類似的)。 –

+0

我有一個疑問,這個線程假設貫穿創建它的對象的整個生命週期。在那段時間內,如果另一個對象訪問thread_func_thunk函數,那麼它是否會導致任何問題,或者兩個創建的線程將安全地並行運行? – user2692032

+0

我發佈的整個示例都是線程安全的。由你決定'thread_func'是否安全並且/或者用不同的實例調用它。 –