5

我一直认为,就像内存一样,操作系统有责任在进程结束后进行清理。不幸的是,我很难找到很多证据,所以我不能真正保证会发生什么。

我的主要问题是,如果一个进程正在锁定一个互斥锁,并且它会在很少或没有清理的情况下突然退出(即,在 C 中调用 abort,或在 C++ 中终止)会发生什么?

  • 是否有任何保证操作系统会解锁互斥锁,或者只是暗示大多数有信誉的系统会(类似于未释放的内存)?

  • 如果没有保证,这实际上会在仍在运行的进程和死进程持有的锁之间造成死锁吗?

  • 如果可以以这种方式创建死锁,是否可以在进程的线程之间复制,而不是通过单独进程之间的共享互斥锁?

4

1 回答 1

6

如果互斥对象是退出进程拥有的(通过创建或打开),它的句柄将在进程终止时关闭。

其他进程等待操作将在这种情况下返回:

对于 Windows,即WaitForSingleObject(...)返回WAIT_ABANDONED,这意味着:

指定的对象是一个互斥对象,在拥有该互斥对象的线程终止之前,该对象没有被拥有该对象的线程释放。互斥对象的所有权被授予调用线程,并且互斥状态设置为无信号。如果互斥体正在保护持久状态信息,您应该检查它的一致性。

对于 Linux,即pthread_mutex_lock(...)返回EINVAL,这意味着:

由 mutex 指定的值不引用已初始化的 mutex 对象。

于 2012-10-28T17:01:44.430 回答