2013-03-11 27 views
0

我可以在這裏獲得社區的意見。我有一個應用程序,其中有多個線程訪問(this)類的成員,該類調用線程本身。問題是,當新線程在LinkedList成員中添加一個元素時,我可以看到LinkedList的count由於添加了元素而增加到1,但是在主線程中,新線程所做的更改沒有反映出來。我甚至將當前對象的引用傳遞給了ParameterizedThreadStart,但它仍然不起作用。會員的多個線程更改不反映在主線程中

插圖:

ParameterizedThreadStart^ pReceiveProc = gcnew ParameterizedThreadStart(this, &ActualClass::Receive); 
Thread^ pReceiveThread = gcnew Thread(pReceiveProc); 
pReceiveThread->Start(this); // passed the current instance 

線程方法:

void Receive(Object^ pObj) { 
    ActualClass^ l_Cls = dynamic_cast<ActualClass^>(pObj); 
    l_Cls->MyLinkList->AddLast("test"); 
    Console::WriteLine("{0}", l_Cls->MyLinkList->Count); //outputs 1 
} 

但如果我從主線程訪問MyLinkList:

void MethodMainThread(){ 
    Console::WriteLine("{0}", MyLinkList->Count); //outputs 0 
} 

靜態成員解決方案不是一個選項。

+0

在MethodMainThread()的上下文中,您確定變量l_Cls仍然引用您傳遞給其他線程的同一個列表嗎? – 2013-03-11 05:45:27

+0

是的,因爲我一直通過主線程的「this」引用,所以我編輯了我的帖子,MethodMainThread沒有l_Cls,因爲它是主線程,所以它應該直接訪問MyLinkList – TravellingGeek 2013-03-11 05:47:06

+0

什麼你的主程序看起來像什麼?你是否在插入元素後真的檢查計數?並知道LinkedList是不是線程安全的,所以使用鎖 – 2013-03-11 05:51:55

回答

0

你不能像這樣在線程之間共享數據。一個簡單的方法是使用'lock'語句。這是相當直接和here's一個很好的解釋。

+0

我已經在LinkList上有我的鎖定機制 – TravellingGeek 2013-03-11 06:07:26

1

最有價值的是,你的輔助線程被搶佔,你的主線程檢查計數,然後輔助線程添加一個對象,嘗試使用信號,並讓主線程等待,直到輔助線程完成其操作。

+0

嗯..這可能不太可能,因爲我在單元測試中手動跟蹤它,所以我會在運行測試之前先讓輔助線程完成這將調用主線程 – TravellingGeek 2013-03-11 06:12:49

+0

中的方法,但單元測試在分離線程本身上運行。沒有使用線程檢查,只是單線程可能會有一些其他問題。 – TalentTuner 2013-03-11 06:13:36