【问题标题】:Building a worker thread pool for a non-thread-safe code为非线程安全代码构建工作线程池
【发布时间】:2009-12-16 20:31:38
【问题描述】:

在 .net 框架中封装非线程安全代码的最佳方式是什么?

我有一个第三方库,由于它使用静态变量,它不是线程安全的。重写它不是一种选择。该库由接收大量同时调用的 asp.net Web 服务使用。

我目前已经将它封装在一个使用锁来确保线程安全的代理类中:

private static readonly object oneThreadAtATimePlease = new object();
public ISomething CalculateSomething(int someValue)
{
    lock (oneThreadAtATimePlease)
    {
        return new UnsafeLibrary(someValue).DoSomething();
    }
}

性能很差,因为多个调用者必须等待锁定,但结果是正确的。

我想通过运行这个库的多个实例来提高性能,每个实例都在自己的 AppDomain 中。这是一个合理的方法吗?有什么好的示例代码可以推荐吗?

【问题讨论】:

  • 在我看来,每次重新实例化库可能都会有相当多的开销 - 特别是因为您是在锁内实例化它。最好先实例化一次,然后再引用该实例。
  • 好点,匿名。不幸的是,由于构造函数设置了静态变量,因此每次调用都需要重新实例化库。我已经修改了上面的示例代码以反映这一点。

标签: .net concurrency thread-safety appdomain worker-process


【解决方案1】:

您也可以尝试使用队列创建基于消息的应用程序。

然后多个线程可以对请求进行排队,一个线程可以在这个队列上工作,并将结果通知其他线程。 使用监视器类并不总是最快的方法。

AppDomains 是一个选项。但是,您将不得不处理 IPC。

【讨论】:

    【解决方案2】:
    【解决方案3】:

    一个只包含一个工作对象实例和一个请求队列的单例呢?

    【讨论】:

      猜你喜欢
      • 2020-02-04
      • 2020-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-20
      • 2015-05-24
      • 2011-05-12
      相关资源
      最近更新 更多