锁内的新线程 - c#

Posted

技术标签:

【中文标题】锁内的新线程 - c#【英文标题】:New thread inside lock - c# 【发布时间】:2014-01-29 10:30:49 【问题描述】:

我需要锁定一个对象(集合),执行一些操作并调用一个使用 ThreadPool(在同一个锁定块内)打开线程的函数。

我的问题,在新线程内执行的操作是否仍会被视为线程安全?

【问题讨论】:

blogs.msdn.com/b/ericlippert/archive/2009/10/19/… 有趣的帖子,谢谢 L.B 【参考方案1】:

没有。新线程的代码在其自己的上下文中运行,lock 语句(实际上只是一种调用Monitor.Enter 的便捷方式)在每个线程的基础上运行。

【讨论】:

【参考方案2】:

您可能会在线程完成其工作之前释放锁,除非您等待它退出。

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

所以在释放锁之前你必须等待 newThread 完成。理想的解决方案是在 newThread 中做所有事情(锁定和 DoSomeWork)。如果这不可行,您可以创建另一个锁定的线程,并等待新线程结束:

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

【讨论】:

谢谢!这很有帮助【参考方案3】:

请看我的帖子:

http://pilpag.blogspot.dk/2016/04/advanced-programming-easy-way-to-manage.html

简而言之,使用以下代码:

public class LockContainer

    private BlockingCollection<object> lockItems  get; set; 

    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);
        
    

【讨论】:

以上是关于锁内的新线程 - c#的主要内容,如果未能解决你的问题,请参考以下文章

仅当主监听器更新时,如何将来自主 EventListener 的 MesageReceivedEvent 与线程内的新变量同步

从 C# 线程内的非托管 dll 运行函数

C#,往线程里传参数的方法总结

C# 往线程里传参数的方法总结

不创建新线程的 C# 异步

C# 线程调用主线程中的控件