【问题标题】:What are the important threading API calls to understand before writing multi-threaded code?在编写多线程代码之前,需要了解哪些重要的线程 API 调用?
【发布时间】:2009-10-13 09:49:54
【问题描述】:

最近我在博客上讨论了 .Net 中经常被过度使用的多线程概念。我整理了一份“你应该首先了解的 API”的列表:

  • 线程
  • 线程池
  • 手动重置事件
  • 自动重置事件
  • EventWaitHandle
  • 等待句柄
  • 监视器
  • 互斥体
  • 信号量
  • 联锁
  • 后台工作人员
  • 异步操作
  • lock 语句
  • 易变
  • 线程静态属性
  • Thread.MemoryBarrier
  • Thread.VolatileRead
  • Thread.VolatileWrite

然后我开始思考也许并非所有这些都很重要。例如,Thread.MemoryBarrier 可能可以安全地从列表中删除。再加上一个明显的声明,我不知道一切,我决定转向这里。

所以这是一个广泛而固执的问题,但我很好奇集体对最佳实践研究清单的看法。从本质上讲,我正在寻找一个简短的列表,供新开发人员和/或初级开发人员从开始使用 C# 编写多线程代码时开始工作。

那么在没有进一步评论的情况下,应该从上面的列表中添加或删除什么?

【问题讨论】:

    标签: c# .net multithreading


    【解决方案1】:

    我认为您需要对多线程的级别进行分类,而不是对不同的 API 进行分类。根据您的线程需求,您可能需要也可能不需要知道您列出的 API 的某些子集。如果我要组织它们,我会按照以下方式进行:

    • 基本多线程:
      • 要求
        1. 需要运行并发进程。
        2. 不需要访问共享资源。
        3. 最大限度地利用可用硬件资源。
      • API 知识
        1. 线程
        2. 线程池
        3. 后台工作人员
        4. 异步操作/委托
    • 共享资源多线程:
      • 要求
        1. 基本多线程要求
        2. 共享资源的使用
      • API 知识
        1. 基本的多线程 API
        2. lock()/Monitor(它们是同一个东西)
        3. 联锁
        4. ReaderWriterLock 和变体
        5. 易变
    • 多线程同步
      • 要求
        1. 基本多线程要求
        2. 共享资源多线程要求
        3. 跨多个线程的行为同步
      • API 知识
        1. 基本的多线程 API
        2. 共享资源多线程 API
        3. 等待句柄
        4. 手动/自动重置事件
        5. 互斥体
        6. 信号量
    • 并发共享资源多线程(超线程)
      • 要求
        1. 基本多线程要求
        2. 共享资源多线程要求
        3. 对共享集合的并发读/写访问
      • API 知识
        1. 基本的多线程 API
        2. 共享资源多线程 API
        3. .NET/.NET 4.0 的并行扩展

    API 的其余部分我将简单地概括为一般线程知识,可以根据需要获取的内容,因为它们适合所有三个级别。像 MemoryBarrier 这样的东西非常边缘化,通常有更好的方法来完成它所完成的同样的事情,而且它们的行为和含义更容易产生歧义。

    【讨论】:

    • +1,同意,当然可以做很多事情来组织和优先处理信息。一个基本的命中列表似乎是合适的第一步。
    【解决方案2】:

    恕我直言,BackgroundWorker 应该在您列表的最顶端。

    解释起来相当简单。可以在大多数情况下使用,并提供很多“物有所值”。对于刚接触线程的人来说,这给了他一些可以实际使用的东西,而无需在他做第一件事之前学习几个小时。

    【讨论】:

    • 我不太确定我会同意。 BackgroundWorker 的简单性很好,但是在没有事先了解多线程编码警告的情况下潜入和使用它很容易并且很可能会导致诸如 UI 控制方法/属性的不当调用、共享资源使用等问题,等等。我什至数不清有多少初级开发人员开始使用 BackgroundWorker,然后花了几个小时或几天试图解决 UI 调用问题(是的,一旦你了解它就很明显了,但直到那一刻,它是就像晦涩难懂的菜鸟一样晦涩难懂。)
    【解决方案3】:

    ParameterizedThreadStart 和 ThreadStart 委托怎么样?

    【讨论】:

      【解决方案4】:

      .NET 4.0 将为这个问题带来一些新工具;其中许多工具将隐藏低级线程 API 的细节。现在,您可以通过使用 LINQ 或学习函数式编程技术等方式开始为利用这一新功能做好准备。

      【讨论】:

        【解决方案5】:

        我建议查看Parallel Extensions coming in .NET 4.0、ThreadPool、BackgroundWorker(如果它们在 WinForms 中工作)和 lock 关键字。它们提供了多线程所需的大部分功能,同时仍然是一个相对安全的实验环境。此外,您应该将 WPF 中的 Dispatcher 添加到您的列表中;与 VolatileRead 相比,开发人员更有可能遇到这种情况。

        【讨论】:

          猜你喜欢
          • 2023-03-20
          • 2015-11-12
          • 1970-01-01
          • 2016-07-26
          • 1970-01-01
          • 1970-01-01
          • 2019-09-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多