2016-12-01 15 views
1

我有一個使用線程的C++ wxWidgets程序。因此我需要確保線程安全地被訪問。在wxThread documentation中解釋瞭如何這樣做。他們使用friend類和wxCriticalSection來保護他們的線程。我是這樣做的,就像在這個例子中一樣,它運作良好,但是當我和一個同事談論這件事時,他告訴我朋友班是邪惡的,應該避免所有的事情,以避免意外的行爲。我應該使用wxMutexwxThread文檔示例有用或錯誤的編碼習慣?

現在我明白了他的觀點,因爲我的main作爲好友類給了線程類完全訪問它。我明白,這可能會導致問題,例如,如果我有類似的命名變量或無意中訪問其他東西,我不應該使用主外。但我想知道這種方法是否有優勢。我的意思是,必須有一些東西,否則我不明白爲什麼這種方式應該(在wxWidgets文檔中描述的唯一方式)?

有人請賜教我關於兩種方法的優缺點嗎?或者,還有第三種方法可以在不使用friend的情況下只從主體訪問wxCriticalSection或將其公開化?感謝您的幫助。


編輯:當我意識到,在我的代碼的關鍵部分是從很久以前的神器,那時並不需要了,這個問題是不是我的編程是至關重要的。不過,我認爲這是一個有趣的話題,對於未來的情況會很有用。

回答

2

有2周在這個問題上完全正交的事情:

  1. 使用friend的確是一個糟糕的主意,並在wxThread文檔的例子可以(也應該)被重寫,以避免它。最簡單的方法是在wxEVT_COMMAND_MYTHREAD_COMPLETED事件處理程序中重置線程指針。
  2. wxCriticalSection在語義上與wxMutex完全相同,事實上,在非Windows平臺下,它們完全相同。在Windows下,wxCriticalSection只是一種更高效的互斥體(兩個類直接對應於Win32 API中的對應體)。如果你只用它來保護一些共享數據,那麼它是完全正常的,事實上,最好使用wxCS而不是wxMutex。但是,您需要使用wxMutexwxCondition
+0

所以如果我把它弄對了,他們可以在例子中使用wxMutex而不是wxCriticalSection,但是用'friend'類來解決這個問題是不好的做法嗎? – Lehue

+0

'朋友'是不好的做法,是的。但是這裏沒有必要使用'wxMutex','wxCS'完全沒問題。而且,這兩點又相互無關。 –