2014-01-29 43 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); 
     } 
    } 
}