2015-05-26 25 views
0

看這個示例代碼共享局部變量:C#:在2個不同的線程

private void StartProgram() 
{ 
    for (int i = 0; i < 10; i++) 
    { 
     if (true) // some conditions 
     { 
      int Temp = i; // every thread has different memory location for Temp variable. 
      Thread ConnectThread = new Thread(ThreadMethod); 
      ConnectThread.Start(Temp); 
     } 
    } 
} 

private static void ThreadMethod(object Index) 
{ 
    int ID = (int)Index; 
    int Result = 0; 
    bool IsConnected; 


    Result = ClientSMPP[ID].tcpConnect(Host[ID], int.Parse(Port[ID])); 

    InsertToDatabaseMethod(); 
} 

據我所知,溫度變量在存儲器中用於每個線程不同的位置。我的意思是每個線程都有一個單獨的字段。但是當我想在ThreadMethod中執行一些操作時,ID字段將會發生衝突。我的意思是它在每次ThreadMethod運行時都沒有唯一的值(例如ID的值是'1'3次)。我知道ThreadMethod中可能有超過1個線程,但它們有不同的內存。我不想使用Lock()。

如何忽略此衝突?

+0

我不明白你的」重新問:你想在多個線程_share_了'int' – pb2q

+0

可能StartProgram中方法調用幾個時間 –

+0

和特定指數「一些條件」爲真 –

回答

2

按照您的要求,提出這個響應的「答案」。很高興我能幫上忙! :)

你沒有通過調用值InsertToDatabaseMethod()。

如果被插入的值是從外部源(例如:一個屬性)的到來,然後是,鎖是要走的途徑。

如果該值是本地的(例如:你插入「ID」到數據庫中,然後就可以通過值作爲參數,避免鎖:InsertToDatabaseMethod(ID)

+1

注意,使用'Interlocked.Increment'方法將不需要'lock',如果你只是想增加一個跨線程manner.https變量://msdn.microsoft。 COM/EN-US /庫/ dd78zt0c%28V = vs.110%29.aspx – MrWombat

0

你可以把它簡化這樣的:

for (int i = 0; i < 10; i++) 
    { 
     if (true) // some conditions 
     {     
      Thread ConnectThread = new Thread(ThreadMethod); 
      ConnectThread.Start(i); 
     } 
    } 

注意,每個線程都有它自己的堆棧。 局部變量存儲在堆棧中。

你沒有問題,因爲整數是值類型。

+0

,但是當我在ThreadMethod()中向數據庫插入索引值時,記錄會是這樣的:1,1,1,2,2,2,5,6,8,8。我想要這個:1,2,3,4,5,6,7,8,9,10它顯示比索引是共享的,我不知道爲什麼... – Elahe

+0

然後你有其他錯誤,你可以通過把一些調試/日誌字符串代碼 –