【问题标题】:Deadlock in 3rd Party dll第 3 方 dll 中的死锁
【发布时间】:2009-07-10 19:11:37
【问题描述】:

我在我的两个 C# 应用程序中使用(和引用)两个第 3 方 dll(a.dll 和 b.dll)。我遇到了一个可重复的问题,即两个应用程序在调用 3rd 方库中的函数时都挂起。

我试图复制 a.dll 和 b.dll(a2.dll 和 b2.dll)并在第二个应用程序中使用它,但结果是 a.dll 引用 b.dll、anb b .dll 引用了 a.dll 并且无法正确加载。

我怀疑在 3rd 方库中存在死锁。我不能使用锁定来防止这种情况。每个应用程序都强制执行锁定以确保该应用程序一次只有一个线程访问该库,但我无法锁定两个程序。

那么,我的问题是如何解决这个问题?

我可以告诉操作系统 (Windows XP) 我不想共享 dll 吗?

谢谢, 乔

【问题讨论】:

  • 这些是不同的应用程序吗?在这种情况下,单线程访问不应该有任何问题,因为每个进程都会正确处理。你能解释一下为什么你认为存在僵局吗?

标签: c# dll deadlock


【解决方案1】:

您可以通过使用命名互斥体来限制访问,因此一次只能访问一个程序。命名互斥锁仅限于整个操作系统,因此可用于防止来自多个进程的访问。

详情请参阅Mutex class

【讨论】:

  • 这必须在某个地方的第 3 方 dll 中,还是在我的代码中?
  • 你可以把它放在你的代码中——它基本上就像你的线程同步一样工作,除了你可以通过这种方式“锁定”整个资源系统。
  • Mutex 和 lock(lockObject) 一样快吗?
  • 没有。获取命名互斥锁是一个慢得多的操作。然而,慢还是比死锁好:)
  • 我有各种应用程序在峰值负载下每秒调用这个 dll 大约 5000 次......所以速度问题困扰着我。有没有办法告诉操作系统不要共享库?
【解决方案2】:

1) 一种方式

  • 创建一个服务器应用程序,它导出/实现第 3 方 API,并使该 API 可用于其他/远程进程(例如,通过使用 dot net remoting 或 Web 服务,通过网络公开 API)。
  • 在服务器应用程序中,通过委托给第三方 DLL 来实现其 API
  • 只启动一个服务器应用程序实例:因此只有一个正在使用的第 3 方 DLL 实例
  • 让您现有的应用程序使用您的服务导出的 API,而不是使用 3rd 方 DLL 的本地实例
  • 在您的服务中实施锁(您可以这样做,因为它现在在一个进程中)。

2) 另一种方式:使用一种在多个进程中可见的锁(例如 Mutex 类)。

3) 询问第三方 DLL 的供应商:您是否应该一次只能运行该 DLL 的一个实例?如果允许您运行多个实例,您必须如何避免跨进程死锁?

【讨论】:

  • 1) 听起来工作量很大:-( 2) 也许... 3) 它是开源的半废弃软件。自 2005 年以来,他们没有更新过。
  • 1) 与你后文所说的每秒调用 5000 次的情况不太相符。
【解决方案3】:

我曾经对停产的第 3 方产品也遇到过类似问题。

在那里,我使用了一个反汇编器和一个带有集成汇编器的十六进制编辑器来修复底层错误,但这或多或少是幸运的,因为原因是一些微不足道的事情,可以通过查看反汇编来得出。

取决于您可能选择的实际原因。

【讨论】:

    【解决方案4】:

    如何创建另一个线程 - 负责访问此 dll...这样整个应用程序不会冻结

    【讨论】:

    • 我已经这样做了。但是,我在每个应用程序中都有一个关键线程被冻结,而这两个应用程序——尽管没有完全冻结——都没有用。
    猜你喜欢
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多