【问题标题】:Is SynchronizationContext.Post() threadsafe?SynchronizationContext.Post() 线程安全吗?
【发布时间】:2010-05-18 18:13:14
【问题描述】:

这是一个非常基本的问题,我想是的,但我找不到任何明确的答案。 SynchronizationContext.Post() 线程安全吗?

我有一个保存主线程上下文的成员变量,并且正在从多个线程调用_context.Post()。我想Post() 可以在对象上同时调用。我应该做类似的事情

lock (_contextLock) _context.Post(myDelegate, myEventArgs);

或者那是不必要的?

编辑:
MSDN 声明“任何实例成员都不能保证是线程安全的。”那么我应该保留我的lock() 吗?

【问题讨论】:

    标签: .net multithreading synchronization locking


    【解决方案1】:

    严格遵守 MSDN 文档然后不,SynchronizationContext.Post 方法不是线程安全的。因此,除非文档中有错误,否则您将需要同步对该方法的访问。我自己很难相信它不是线程安全的,但你不能依赖假设,尤其是在处理线程同步问题时。在 Microsoft 更正文档或真正使其成为线程安全之前,真的没有办法解决这个问题。

    【讨论】:

    • 查看反汇编代码,此方法只调用 ThreadPool.QueueUserWorkItem,根据 msdn,它是线程安全的。
    • @Phil:这并不奇怪。不幸的是,Microsoft 已经有效地保留了更改实现的权利,以使其在未来版本或服务包中的当前线程安全行为无效。我的猜测是,他们确实打算让该类具有线程安全的实例方法,并且他们只是搞砸了文档。但是,这只是一个假设。
    • 考虑到它的用法,他们将其更改为不是线程安全的将是愚蠢的!
    • @RichardOD:我完全同意!他们确实需要修复文档。这也不是唯一需要修复的实例。
    【解决方案2】:

    SynchronizationContext.Post 是线程安全的。文档忽略了这一事实。

    我的断言基于 Microsoft 的 AsyncOperationAsyncOperationManager 实现,它们假设 SynchronizationContext.Post 是线程安全的(包括任何派生实现)。

    【讨论】:

      猜你喜欢
      • 2020-04-15
      • 2011-07-04
      • 2014-04-26
      • 2012-11-30
      • 2010-12-30
      • 2013-03-12
      • 2021-08-03
      • 2010-12-27
      • 2018-06-04
      相关资源
      最近更新 更多