2014-01-29 44 views
1

我需要鎖定一個對象(集合),做一些操作並調用一個使用ThreadPool(在同一個鎖塊內)打開一個線程的函數。鎖內新線程 - c#

我的問題,在新線程內執行的操作仍然會被視爲線程安全嗎?

+0

http://blogs.msdn.com/b/ericlippert/archive/2009/10/19/what-is-this-thing-you-call-thread-safe.aspx –

+0

有趣的帖子,謝謝LB –

回答

2

在線程完成其作業之前,您可能會釋放鎖定,除非您等待它退出。

lock(collection){ 
    DoSomeWork(); 
    LaunchNewThread(); => newThread starts 
} => the lock will likely be released BEFORE newThread ends 

因此,您必須等待newThread在釋放鎖之前完成。理想的解決方案是在newThread內部完成所有任務(鎖定和DoSomeWork)。如果這是不可能的,你可以創建另一個線程鎖,並等待FOT newThread結束:

anotherThread{ 
    lock(collection){ 
     DoSomeWork(); 
     LaunchNewThread(); 
     newThread.JOIN(); => execution will stop until newThread finishes 
    } => the lock will be released AFTER newThread returns 
} 
+0

謝謝!這有很大幫助 –

2

否。新線程的代碼在其自己的上下文中運行,並且lock語句(這實際上只是一種方便的方式,稱爲Monitor.Enter)以每個線程爲基礎運行。

+0

感謝您的幫助 –

1

看看我的帖子在這裏: http://pilpag.blogspot.dk/2016/04/advanced-programming-easy-way-to-manage.html

總之,使用此代碼: 公共類LockContainer { private BlockingCollection lockItems {get;組; }

private object LocalLockItem { get; set; } 


    public LockContainer() 
    { 
     lockItems = new BlockingCollection<object>(); 
     LocalLockItem = new object(); 
    } 

    public object GetLockItem(string str) 
    { 
     lock (LocalLockItem) 
     { 
      if (!lockItems.Any(li => (string)li == str)) 
      { 
       lockItems.Add(str); 
      } 
      return lockItems.First(li => (string)li == str); 
     } 
    } 
}