2013-05-02 161 views
0

使用CreateThread()時,兩個線程是否可以使用單個函數「ThreadProc」作爲其線程過程?兩個線程可以使用相同的線程程序嗎?

HANDLE thread1= CreateThread(NULL, //Choose default security 
           0, //Default stack size 
           (LPTHREAD_START_ROUTINE)&ThreadProc, 
           //Routine to execute. I want this routine to be different each time as I want each thread to perform a different functionality. 
           (LPVOID) &i, //Thread parameter 
           0, //Immediately run the thread 
           &dwThreadId //Thread Id 
          ) 
HANDLE thread2= CreateThread(NULL, //Choose default security 
           0, //Default stack size 
           (LPTHREAD_START_ROUTINE)&ThreadProc, 
           //Routine to execute. I want this routine to be different each time as I want each thread to perform a different functionality. 
           (LPVOID) &i, //Thread parameter 
           0, //Immediately run the thread 
           &dwThreadId //Thread Id 
          ) 

請問上面的代碼中創建兩個線程每個相同的功能(因爲線程程序兩個線程的相同。)我是不是做正確嗎?

如果可能,那麼會有任何同步問題,因爲兩個線程都使用相同的線程程序。

請幫我這個。我非常困惑,無法通過互聯網找到任何東西。

+0

從這裏開始:http://en.wikipedia.org/wiki/Thread_(computing) – 2013-05-02 08:26:25

+1

你的第二個線程ID將覆蓋第一個。如果你不關心線程ID,只需傳遞NULL即可。如果你在意,使用'dwThreadId1'和'dwThreadId2'(或者一個數組,當然)。 – MSalters 2013-05-02 11:07:33

+0

+1,謝謝:) – Ayse 2013-05-02 11:20:53

回答

6

使用與多個線程的線程入口點相同的函數是很好的。

但是,從發佈的代碼中,地址i正在傳遞給兩個線程。如果其中一個線程修改了這個內存,另一個線程則在i上出現競爭條件。沒有看到i的聲明,它可能是一個局部變量。這是非常危險的,因爲線程需要i一生存在。如果i不是線程將有一個懸掛指針。通常的做法是動態分配線程參數並讓每個線程釋放它的參數。

+0

編輯我的代碼。現在請看一下:( – Ayse 2013-05-02 09:02:07

+0

@AyeshaHassan,不要編輯問題以回答問題,這會讓後來出現問題的人感到困惑,並使得發佈的答案顯得不正確或無益。 「通過線程參數」或發佈一個新問題 – hmjd 2013-05-02 09:04:21

+0

我明白了,非常感謝您的解釋 – Ayse 2013-05-02 09:08:43

4

線程是否使用相同的代碼是無關緊要的。它對同步沒有任何影響。它的行爲與它們是不同的功能完全相同。潛在種族的問題是一樣的。

你可能不想讓兩個線程傳遞相同的指針。這可能會導致數據競賽。 (雖然我們必須看到代碼才能確定)

2

您的代碼是正確的。這兩個線程之間沒有任何同步問題。如果他們需要同步,那可能是因爲他們改變了同一個全局變量,並不是因爲他們使用相同的線程過程。

+0

非常感謝:) – Ayse 2013-05-02 09:01:18

5

是的,很可能有多個(併發)線程以相同的入口點開始。 除了OS /線程庫指定簽名並調用它之外,線程入口函數沒有什麼特別之處。它可以用來從多個線程調用任何其他函數的同樣的注意事項來啓動多個線程:您需要同步來訪問非原子共享變量。

每個線程都使用自己的堆棧區域,但是在線程過程被調用之前由操作系統分配,因此在調用線程過程時,所有需要創建和啓動新線程的特殊操作已經發生。

相關問題