2011-02-11 93 views
0

我有一個小小的困惑。我使用一個名爲地位與屬性在C#中的靜態變量,分別如下使用鎖時的注意事項

private static bool status; 

public static bool Status 
{ 
    get { return status; } 
    set { status = value; } 
} 

我現在已經開始2個線程 第一個線程使用屬性變量狀態爲真/假 第二個線程設置值,使用得到值屬性爲可變狀態。

在這種情況下

在這裏,我想一樣,如果第一個線程試圖同時第二個線程試圖讀取的變量狀態

我是否需要使用鎖語句中的值更新的變量狀態值會發生什麼
對於這個變量狀態裏面的屬性來處理線程同步還是不需要的? 任何人都可以通過澄清這個疑問來幫助我嗎?

+0

[正在訪問C#中的變量是原子操作?](http://stackoverflow.com/questions/9666/is-accessing-a-variable-in-c-an-atomic-operation) – 2011-02-11 10:22:10

+0

我是這個c#.net環境的新手。我看到了這個鏈接,它看起來非常高。我無法清楚地理解。你能否得出結論並告訴我應該使用鎖定語句嗎? – Senthil 2011-02-11 10:31:00

回答

0

同步訪問裏面的該屬性不會實現任何目的,因爲鎖是爲了阻止訪問共享資源跨越使用該資源的代碼塊。

需要同步的是訪問屬性的整個塊。一般來說,您需要在呼叫者級同步訪問。

void Thread1() { 
    lock(myObj) { 

     if(myObj.Status) 
      Console.WriteLine("Status is true"); 

     // ... 

     // myObj.Status is guaranteed to be still true as long as 
     // all the code that accesses the property lock myObj. 
     if(myObj.Status) 
      Console.WriteLine("Status is still true"); 

    } 
} 

請注意,您不需要鎖定具有該屬性的對象。只要它在所有相關線程之間共享,您就可以使用另一個對象作爲同步機制。

static object mutex = new object(); 

void Thread1() { 
    lock(mutex) { 

     if(myObj.Status) 
      Console.WriteLine("Status is true"); 

     // ... 

     // myObj.Status is guaranteed to be still true as long as 
     // all the code that accesses the property lock myObj. 
     if(myObj.Status) 
      Console.WriteLine("Status is still true"); 

    } 
} 
1

從你的問題我明白線程一產生的狀態值和線程兩消耗的價值,並做了一些工作的基礎上。這裏不需要鎖,因爲從原始類型讀取是線程安全的(當你正在讀取其他線程不會破壞的數據時)。只有當您有兩個或更多想要寫入數據的寫入器線程時才需要鎖定。例如,如果您的線程都要設置狀態值,則需要鎖定塊。