的例子假定您將產生的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
你的意思是:「運行同一個線程的不同副本」。這對我來說似乎沒有意義... – 2012-04-27 09:37:27
假設汽車是一個班級,並有幾輛汽車試圖進入狹窄的車道,例如MyThread是一個類,所以可能有多個線程 – 2012-04-27 09:54:58
我猜「相同的線程「你的意思是相同的類類型(從wxThread派生),因爲在wxWidgets中,通過從wxThread繼承來創建一個線程類。此類類型的每個對象都將啓動一個單獨的線程。或者如果你有不同的繼承自wxThread的類,那麼任何這些類型的每個對象都將啓動新的線程。 – JohnPS 2012-04-27 10:21:56