2014-04-04 23 views
0

假設您在Win32中有兩個線程。假設主UI線程啓動一個工作線程A.假設線程A創建時,返回主線程中的類的指針被髮送給線程A.在線程A處理期間的某一時刻,線程A調用主函數線程通過指針。線程A和主線程永遠不會爭用相同的數據,也不會同時調用同一個函數。線程設計和設計以及從C++中的另一個線程中調用函數Win32

這是不好的做法?

如果是的話,那麼這個功能的正確設計是什麼。線程A需要訪問主線程中的函數,以訪問保存在主線程中的數據。但預計線程A在主線程訪問數據時不會調用主線程中的函數。因此,不會有數據爭用。但是,當線程仍在調用主線程中的函數時,主線程可能會重新啓動。

只要沒有數據爭用並且被調用的函數是可重入的,這樣做還是可以在其他線程中調用函數?

+0

如果工作線程調用一個函數,那麼定義該函數的位置並不重要,它將始終在工作線程的上下文中調用。你不能在其他線程中「調用」函數。 –

+0

Joachim,感謝您的信息。 「你不能在其他線程中調用函數」是什麼意思?你說這是不好的做法嗎?如果是這樣的話,在Win32線程中調用函數的正確設計是什麼 - 在不可見的窗口線程中使用消息(比直接調用需要更長的時間)? – brimaa

+0

我的意思是說所有*函數都是從例如「線程A」將在「線程A」的上下文中。要在另一個線程環境中調用函數,必須使用[消息傳遞](http://en.wikipedia.org/wiki/Message_passing),並讓其他線程執行實際的函數調用。 –

回答

1

線程在進程中是全局的,在所有線程之間共享。沒有「主線程中的函數」這樣的東西。

重要的是如何共享數據。一個函數由兩部分組成:代碼本身和它所操作的數據。

作爲一般規則,代碼是靜態的。這就是代碼在線程之間自由共享的原因。從來沒有任何爭論。

雖然這是一個不同的數據。您需要確保多線程之間共享的數據沒有不正確的爭用。只要您滿足於此,就可以從多個線程中調用相同的函數。

+0

+1和一個潛在的問題 - 對於每個人來說,在線程間共享一個「static」函數變量可能並不明顯。這就是爲什麼像'strtok'這樣的函數使用線程局部靜態變量的原因。 –