熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

詳解.NET編程過程中的線程沖突[3]

2013-11-13 12:16:49  來源: .NET編程 

  互斥鎖

  有時候我們不得不面對線程不安全的問題比如說在一開始提出來的那個例子多線程完成次任務我們怎樣才能解決這個問題一個簡單的辦法就是給共享資源加上互斥鎖在C#中這很簡單比如一開始的那個例子

public static class Environment{public static int count = ;//全局計數器
}
//…void ThreadMethod()//運行在每個線程的方法
{
while( true )
{
lock ( typeof( Environment ) )
{
if ( count >= )//如果達到任務指標
break;//中斷線程執行
DoSomething();//完成某個任務
count++;}}}

  通過互斥鎖使得一個線程在使用count字段的時候其他所有的線程都無法使用而被阻塞等待達到了避免線程沖突的效果

  當然這樣的鎖會使得這個多線程程序退化成同時只有一個線程在跑所以我們可以把count++提前使得lock的范圍縮小如這樣

void ThreadMethod()//運行在每個線程的方法{
while( true )
{
lock ( typeof( Environment ) )
{
if ( count++ >= )//如果達到任務指標
break;//中斷線程執行
}
DoSomething();//完成某個任務
}}

  最後來聊聊SyncRoot的問題

  用NET的一定會有很多朋友困惑為什麼對一個容器加鎖需要這樣寫

lock( ContainerSyncRoot )

  而不是直接lock( Container )

  因為鎖定一個容器並不能保證不會對這個容器進行修改考慮這樣一個容器

public class Collection{
private ArrayList _list;
public Add( object item )
{
_listAdd( item );
}
public object this[ int index ]
{
get { return _list[index]; }set { _list[index] = value;}
}}

  看起來將其lock起來後就萬事大吉了沒有人能修改這個容器但實際上這個容器不過是用一個ArrayList實例來實現的如果某段代碼繞過這個容器而直接操作_list的話則對這個容器對象lock也不可能保證容器不被修改了

[]  []  []  


From:http://tw.wingwit.com/Article/program/net/201311/15565.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.