在编写多线程代码之前,要理解哪些重要的线程API调用?

csh*_*net 1 .net c# multithreading

最近我在博客上写了关于.Net中多线程的过度使用的想法.我整理了一份"你应该先了解的API"的盯着列表:

  • 线
  • 线程池
  • ManualResetEvent的
  • 的AutoResetEvent
  • 的EventWaitHandle
  • WaitHandle的
  • 监控
  • 互斥
  • 信号
  • 互锁
  • 的BackgroundWorker
  • AsyncOperation
  • 锁定声明
  • 挥发物
  • ThreadStaticAttribute
  • Thread.MemoryBarrier
  • Thread.VolatileRead
  • Thread.VolatileWrite

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

所以这是一个广泛而自以为是的问题,但我很好奇集体对最佳实践研究清单的看法.基本上我正在为新的和/或Jr.开发人员寻找一个简短的命中列表,从开始编写C#中的多线程代码开始工作.

所以如果没有进一步的评论,应该从上面的列表中添加或删除什么?

jri*_*sta 6

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

  • 基本多线程:
    • 要求
      1. 需要运行并发进程.
      2. 不需要访问共享资源.
      3. 最大限度地利用可用的硬件资源.
    • API知识
      1. 线
      2. 线程池
      3. 的BackgroundWorker
      4. 异步操作/代理
  • 共享资源多线程:
    • 要求
      1. 基本的多线程要求
      2. 使用共享资源
    • API知识
      1. 基本多线程API
      2. lock()/ Monitor(它们是同一个东西)
      3. 互锁
      4. ReaderWriterLock和变体
      5. 挥发物
  • 多线程同步
    • 要求
      1. 基本的多线程要求
      2. 共享资源多线程要求
      3. 跨多个线程的行为同步
    • API知识
      1. 基本多线程API
      2. 共享资源多线程API
      3. WaitHandle的
      4. 手动/的AutoResetEvent
      5. 互斥
      6. 信号
  • 并发共享资源多线程(超线程)
    • 要求
      1. 基本的多线程要求
      2. 共享资源多线程要求
      3. 对共享集合的并发读/写访问
    • API知识
      1. 基本多线程API
      2. 共享资源多线程API
      3. .NET/.NET 4.0的并行扩展

其余的API我只是简单地融入一般的线程知识,可以根据需要选择的东西,因为它们适合所有三个级别.像MemoryBarrier这样的东西很漂亮,并且通常有更好的方法来完成它完成的同样的事情,而不会模糊他们的行为和意义.