2013-08-31 117 views
-2
Public void example(int a,int b) 
{ 
    int d=a; 
    int w, c; 
    ThreadPool.GetMinThreads(out w, out c); 
    ThreadPool.SetMinThreads(100, c); 
    ThreadPool.QueueUserWorkItem(new WaitCallback(method), d);      
} 

Public void method(object d) 
{ 
    console.Writeline(d); 
} 

問題:當一個線程進入example()時,它將自己的值賦給一個分配給c的值。線程進入語句ThreadPool.QueueUserWorkItem(new WaitCallback(method), d)時,新線程輸入example(),並修改c的值。因此第一個線程也會將修改後的值d發送到method()。結果兩個線程都打印出相同的值d使可變線程安全

要求:我想每個線程都保存自己的d值,第二個線程進入method()不應該修改d的第一個線程值。我知道'鎖(obj)'可以是一個選項。建議我在這種情況下鎖定一些好方法,並用其他方法來達到我的要求。 注意:考慮線流量較高。

+0

不,它不。曾經調用過的方法將具有在其ThreadPool.QueueUserWorkItem時出現的c的值。他們不會分享c的「單一」值。 – xanatos

+0

我編輯了文字。請回答。 – Rajesh

+0

@HansPassant這甚至不會編譯。兩個局部變量'c' :( –

回答

1

正如我告訴過你的,你說的是錯誤的。每個method將使用它收到的值。一個小測試(我已修改您的代碼,以便線程將同時啓動)

using System; 
using System.Threading; 

class Program 
{ 
    static ManualResetEvent mre = new ManualResetEvent(false); 

    static void example(int a, int b) 
    { 
     int d = a; 
     int w, c; 
     ThreadPool.GetMinThreads(out w, out c); 
     ThreadPool.SetMinThreads(100, c); 
     ThreadPool.QueueUserWorkItem(new WaitCallback(method), d); 
    } 

    static void method(object d) 
    { 
     mre.WaitOne(); 
     Console.WriteLine(d); 
    } 

    static void Main(string[] args) 
    { 
     example(1, 2); 
     example(3, 4); 
     Thread.Sleep(1000); 
     Console.WriteLine("The threads are still waiting after 1 sec..."); 
     mre.Set(); 
     Thread.Sleep(1000); 
     Console.WriteLine("Now I hope they finished"); 
    } 
}