2014-06-13 42 views
0

當我在一個程序中創建一個新的線程...在它的線程處理函數中,爲什麼我要通過線程函數原型將參數(如void指針)作爲參數傳遞給我想要的線程?由於線程與主程序共享相同的內存段(堆棧除外),我不應該直接使用變量而不是從主程序向新線程傳遞參數嗎?爲什麼要通過線程函數傳遞參數?

回答

3

嗯,是的,你可能直接使用變量。也許。假設在你的線程開始運行之前它們沒有被其他線程改變。另外,函數傳遞參數(包括線程函數)的很大一部分是限制被調用函數必須知道的關於外​​部世界的信息量。如果你爲了完成它的工作而傳遞線程函數所需的所有東西,那麼你可以相對不受懲罰地改變程序的其餘部分,線程仍然可以繼續工作。但是,如果強制線程知道有一個名爲MyStringList的全局字符串列表,則不能在不影響線程的情況下更改該全局列表。

信息隱藏。封裝。關注點分離。等

0

您不能以任何類型的正常註冊/堆棧方式將參數傳遞給線程函數,因爲線程函數不會由創建線程調用 - 它們由底層操作系統直接執行,並且執行此副本的API直接執行一個固定數量的參數(通常只有一個void指針)到新線程的新的不同堆棧。

正如吉姆所說,不理解這種機制通常會導致災難。關於那些開發的變量有什麼問題。在新線程開始之前,希望會被新線程使用。