除了Mutex
以外,还有什么能够以容错方式同步两个进程?请耐心等待...Mutex替代进程同步/信号与异步支持?
有一个过程A,它有点片状,它需要在后台启动进程B并继续。如果进程A成功完成它的任务,它需要通知进程B进行处理,并继续前进(它不会终止并且线程被重用)。如果进程A因异常,终止等而死亡,进程B需要快速检测并自行处理。进程A不是一个“进程”,而是一个由不同主机执行的库,因此进程B不能等待进程A的名称消失。
输入互斥量。
这里过程A由一个测试夹具代表,如果成功,它会调用TestFixtureTearDown
并继续前进,或者测试运行器可能会被终止并且TestFixtureTearDown
从未被执行。由于实际过程中,TestFixtureTearDown
可能是由不同的线程来一个跑TestFixtureSetUp
和创建互斥调用,因此ReleaseMutex
有时会抛出ApplicationException : Object synchronization method was called from an unsynchronized block of code.
我可以强制
TestFixtureTearDown
ReleaseMutex
,如果是由不同的线程执行或者以其他方式放弃互斥?对于这种容错“反向”等待/监视器场景,我可以使用Mutex吗?最好不实施过程A发送心跳给过程B和过程B的跟踪间隔并超时?互斥体感觉像这样一个优雅的解决方案,除了偶尔在异步的
ApplicationException
。
。
namespace ClassLibrary1
{
public class Class1
{
private Mutex _mutex;
private Process _process;
[TestFixtureSetUp]
public void TestFixtureSetUp()
{
_mutex = new Mutex(true, "foo");
_process = Process.Start("ConsoleApplication1.exe");
}
[Test]
public void Test1() { /* Do stuff */ }
[Test]
public void Test2() { /* Do async stuff */ }
[TestFixtureTearDown]
public void TestFixtureTearDown()
{
_mutex.ReleaseMutex();
_process.WaitForExit();
}
}
}
。
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var mutex = Mutex.OpenExisting("foo");
// Start doing stuff
try { mutex.WaitOne(); }
catch (AbandonedMutexException) { }
finally { mutex.ReleaseMutex(); }
// Finish doing stuff
}
}
}
谢谢,我在想信号灯,但无法找到如何复制'AbandonedMutexException'行为时,即启动过程中意外死亡,没有信号完成任何事情。这一切都回到一方的心跳和另一方的超时。它是否有*抛弃*状态/事件? – 2014-10-03 09:44:10
我没有想到这一点。那时我不认为信号量是答案。接下来的想法是使库使用任何IPC机制将其运行的PID传送到“观察者”过程。然后您可以等待进程终止。 – usr 2014-10-03 09:50:03