【问题标题】:Threading background questions线程背景问题
【发布时间】:2018-03-29 07:31:01
【问题描述】:

我喜欢线程,但我在 Internet 上找不到任何信息(也许我只是不知道如何正确搜索)关于后台发生的事情,例如在舞台上线程饥饿。操作系统如何处理它?我的线程是在排队等待获得在线程池中创建的机会,还是在无法创建的 xy 时间后被杀死?还是完全不同的东西?

另一个问题是我为什么要关心线程上下文?通过调用ConfigureAwait(false),我知道我不会等待可以翻译为“我不关心那个上下文”的线程上下文。据我所知,致电ConfigureAwait(false) 我正在处理死锁。

最后一个问题是,当死锁发生时,后台发生了什么?主线程是否尝试捕获该上下文或其他内容?

【问题讨论】:

  • "我为什么要关心线程上下文?" - 因为有时在同一个线程上继续很重要。思考:UI 线程。
  • 但据我了解(这可能是错误的),ConfigureAwait 默认为 true,这意味着我可能会遇到任何人都不想要的死锁。但是如果我将其设置为 false,我将处理死锁,这意味着我不会等待新创建线程的上下文。
  • 是的,所以?我要说的是,在某些情况下,上下文很重要,因此你应该关心。
  • 你能解释一下我应该关心上下文和不应该关心上下文的情况吗?如果我理解正确的话,当我将一些任务返回到主(UI)线程时,我应该关心上下文,而当我做一些不应该在主(UI)线程上返回的事情时,我不应该关心?如果你想关心上下文,如果你设置 false 为 ConfigureAwait,你如何避免主线程死锁?
  • 也许 google Stephen C's blog 以及他对这些话题的看法。

标签: c# multithreading asynchronous


【解决方案1】:

我认为死锁在这里被用在了错误的上下文中。死锁描述了两个或多个线程被永远阻塞,互相等待的情况(例如lock statement)。

线程饥饿:饥饿描述了线程无法定期访问共享资源并且无法取得进展的情况。

我的线程是在排队等待获得在线程池中创建的机会,还是在无法创建的 xy 时间后被杀死?

我真的不明白这个问题。 您的线程不会等待创建。您的函数创建线程。

另一个问题是我为什么要关心线程上下文?

来自 MSDN:“上下文是属性的有序序列,它为驻留在其中的对象定义环境。在配置为需要某些自动服务(例如同步、事务、即时激活、安全等。多个对象可以存在于一个上下文中。”

这里有一个类似的问题:Why would I bother to use Task.ConfigureAwait(continueOnCapturedContext: false);

最后一个问题是,当死锁发生时,后台发生了什么?

两个线程一直运行(相互等待),直到您关闭应用程序。

【讨论】:

  • 到你不明白的部分。我将尝试重建我的问题。如果线程池已满并且池中不能再有线程。我要创建的线程会发生什么?
  • 全部解释在这里:msdn.microsoft.com/de-de/library/…
  • 这个不错。有了所有这些回复,我得到了我想要的所有答案。谢谢。
猜你喜欢
  • 2019-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多