2012-04-27 59 views
1

我在讀下面的例子中,在互斥體保護: -互斥在C++中使用wxWidgets

訪問http://docs.wxwidgets.org/2.8/wx_wxmutex.html#wxmutex

有一個註釋代碼這裏: -

//we store some numbers in this global array which is presumably used by 
//several threads simultaneously 

是否運行幾個線程意味着運行同一線程的不同副本(如果是這樣,那麼請幫助我這樣做)或者具有不同功能的功能,但可以訪問關鍵部分。

+0

你的意思是:「運行同一個線程的不同副本」。這對我來說似乎沒有意義... – 2012-04-27 09:37:27

+0

假設汽車是一個班級,並有幾輛汽車試圖進入狹窄的車道,例如MyThread是一個類,所以可能有多個線程 – 2012-04-27 09:54:58

+0

我猜「相同的線程「你的意思是相同的類類型(從wxThread派生),因爲在wxWidgets中,通過從wxThread繼承來創建一個線程類。此類類型的每個對象都將啓動一個單獨的線程。或者如果你有不同的繼承自wxThread的類,那麼任何這些類型的每個對象都將啓動新的線程。 – JohnPS 2012-04-27 10:21:56

回答

0

的例子假定您將產生的T多個實例,他線程MyThread的,這將發生變異的變量:因爲多個線程訪問,你需要處理同步的相同數據

wxArrayInt s_data; 

,與例如在互斥這個例子。

s_mutexProtectingTheGlobalList->Lock(); 

s_data.Add(num); 

s_mutexProtectingTheGlobalList->Unlock(); 

這樣,只有1個線程能夠同時訪問數據,並且可以防止多線程問題。

如果你不這樣做,有機會的話線程中斷海誓山盟時可能使用的過時的數據,這裏是一個基本的例子:

int a = 0; 

void foo() 
{ 
int b = a; 
b += 1; 
a = b; 
} 

,如果有2個線程使用相同的數據此功能,以下可能會發生:

thread 1: 
    reads a into b (a = 0, b = 0) 
    adds 1 to local b (a = 0, b = 1) 
    end of timeslice, switches to thread 2 
thread 2: 
    reads a into b (a = 0, b = 0) 
    adds 1 to local b (a = 0, b = 1) 
    writes b back into a (a = 1, b = 1) 
    end of timeslice/operation 
thread 1: 
    writes b back into a (a = 1, b = 1) 

,是因爲2個線程擁有的數據,這在線程2的情況下副本過時, 他們將覆蓋海誓山盟,所以不是一個爲2,它是1 線程1