gpt4 book ai didi

.net - 进程退出时自动释放信号量

转载 作者:行者123 更新时间:2023-12-02 08:51:03 25 4
gpt4 key购买 nike

我正在使用信号量来限制我的应用程序可以运行的并发实例的数量。

终止进程的方式有很多种。是否可以创建信号量以便在进程退出时自动释放?

编辑:

我想要一些魔法来在退出或崩溃时自动清理拥有信号量的进程的“引发”状态。无论如何,只是为了确保它被清除。

更多:

我正在寻找任何可行的选择,考虑到:

  • 如果不需要任何外部应用程序就可以控制 protected 应用程序的每个实例,那就太好了
  • 它不一定是信号量 - 任何具有 COUNTER 并在所有者进程死亡时自动释放的同步对象都可以,即使它是作弊的
  • 我正在使用 .NET 2.0,无法在此项目中迁移到较新版本,但可以使用 c/c++ 和互操作来利用某些内容(如果有)

最佳答案

您可以连接到 AppDomain.ProcessExit事件来执行任何清理操作,例如释放信号量。

通常,命名信号量旨在协调跨进程的资源,而不考虑特定的进程生命周期。 .NET 中的信号量由 native Windows semaphore objects 支持,MSDN 说:

The semaphore object is destroyed when its last handle has been closed. Closing the handle does not affect the semaphore count; therefore, be sure to call ReleaseSemaphore before closing the handle or before the process terminates.

因此,正确的方法是在进程终止之前进行显式处理。

<小时/>

更新 - 需要考虑的其他选项:

  1. 如果在 AppDomain.ProcessExit 事件中手动处理“紧急”释放不可行,请考虑创建一个 IDisposable 包装器,该包装器将在其构造函数中获取信号量,并在 Dispose 方法中释放它。
  2. 另一个问题是:信号量是这种情况下正确的同步对象吗?一个简单的(命名的)互斥体不是更好吗?
<小时/>

更新 - 如果应用程序崩溃或强制终止(即通过任务管理器),ProcessExit 将没有机会被处理。因此,多个进程之间共享的任何非托管资源可能无法正确完成/处置/处理。请参阅this article了解更多详情。

一个可行的选择可能是 creating a named pipe 。命名管道的优点是一旦创建进程终止它们就停止退出。根据 MSDN:

Note that an instance of a named pipe may have more than one handle associated with it. An instance of a named pipe is always deleted when the last handle to the instance of the named pipe is closed.

有两个选项可以限制管道实例的数量:

  1. 仅一个实例:通过在 dwOpenMode 参数中指定 FILE_FLAG_FIRST_PIPE_INSTANCE 标志,可以禁止创建管道的多个实例。然后,尝试创建管道的第二个进程将收到错误。
  2. 更多实例:通过在 nMaxInstances 参数中指定允许的实例数量。当允许N时,第N+1进程将收到错误。

关于.net - 进程退出时自动释放信号量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5231569/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com