2009-02-22 131 views

回答

13

創建這兩種類型的結構並將指針傳遞給它。這是通過單個指針將數據傳遞給線程的標準方式 。

+0

通稱結構thread_xyz_params ;-) – EricSchaefer 2009-02-22 20:26:34

+0

@Artyom:謝謝:) – Aaron 2009-02-22 20:38:29

1

std::pair是你的朋友。

+0

有趣的從來沒有聽說過... ... – Aaron 2009-02-22 20:32:33

2

而不是創建struct_thread_xyz_params,如果可能的話,我會首先使用boost :: thread。如果這不是一種選擇,我會創建一個包裝模板函數對象,當它被構建與自身要求的CreateThread:

template <class Func> 
class Thread 
{ 
    Func m_Func; 
    static DWORD WINAPI ThreadFunc(void* param) 
    { 
     Thread& pFunc = *(Thread*)param; 
     pFunc(); 
     return S_OK; 
    } 
public: 
    Thread(Func& func): m_Func(func){ 
     CreateThread(NULL,NULL,Thread::ThreadFunc,this,NULL,NULL); 
    }; 
    void operator()() 
    { 
     m_Func(); 
    } 
}; 

那麼如果我有花有兩個參數的函數:

void printTwoStrings(string a, string b) 
{ 
    cout << a << " " << b << endl; 
}; 

我可以將它們包裝在一個函子:

class StringFunc 
{ 
    string m_a; 
    string m_b; 
public: 
    StringFunc(string a, string b):m_a(a),m_b(b) 
    { 

    }; 
    void operator()(){ 
     printTwoStrings(m_a,m_b); 
    } 
}; 

和按需initiliaze該函子的一個實例:

int main() 
{ 

    Thread<StringFunc> myThread(StringFunc("hello","world")); 
    Sleep(500); 
    return 0; 
} 

請注意,我在最後睡着了,你根本就沒有說任何關於等待線程完成的任何信息...... struct_xyz_params的難點在於你經常需要稍後的struct_wxyz_params和複製的誘惑代碼總是高...

boost :: thread也很好(但我已經說過了)。

-Rick