作者Gayarou (信竹)
看板C_Sharp
標題[問題] Thread中的物件變數問題
時間Thu May 7 16:57:15 2009
再次打擾各位先進了。
剛剛在測試之前寫的MultiThread Server時遇到了變數數值上的問題,
在這邊跟各位請教一下..
我的Server開啟之後,TCPListener會不斷的等待連線,
而當有連線進來時,Server會先New一個"連線處理物件"後,
再New一個Thread將這個"連線處理物件"丟進去。
這部份大概的程式碼如下:
...
while (true)
{
while (!mServer.Pending()) //TcpListener mServer
{
Thread.Sleep(1000);
}
connObject cObj = new connObject(); //建立新的連線處理物件
cObj.threadListener = mServer;
Thread newThread = new Thread
(new ThreadStart(cObj.ServerThreadProc));
newThread.Start();
}
當有連線進來時,應該是確實有Thread被建立的。
而我一直以為New出來並丟進Thread的"連線處理物件"是各自分開的。
但是剛剛在測試兩個Client同時連線並動作時發現,
應該是B的"連線處理物件"中的變數數值竟然是 A的"連線處理物件中"的變數數值。
這代表了A跟B同時改變變數時,其實改變到的是同一個變數,
而非各自的連線所建立的"連線處理物件"中的變數..
不知道有沒有熟悉這部份的先進能夠指點一下,
是我指定的方式有誤? 還是這樣建立Thread的方式有問題呢?
謝謝各位 >"<||
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 120.125.83.70
1F:推 ilovebbs:這樣寫thread不是只存在於此while裡面嗎? 05/08 07:52
2F:→ Gayarou:花了不少時間找到問題了 這邊的Thread部份其實沒有問題 05/08 13:13
3F:→ Gayarou:這邊的while(true)指的是Server在Live的狀況時 05/08 13:13
4F:→ Gayarou:所以在程式結束前Thread都還會存在(用debug工具確定過了) 05/08 13:14
5F:推 ilovebbs:這樣跟C++是不是不太一樣啊?變數的生存範圍 05/09 22:14