锁内的新线程 - 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 与线程内的新变量同步