5

私はいつも、メモリと同じように、プロセスが終了した後にクリーンアップするのはOSの責任であると想像していました。残念ながら、私はこれの多くの証拠を見つけるのに苦労しているので、何が起こるかを本当に保証することはできません。

私の主な質問は、プロセスがミューテックスをロックしていて、クリーンアップがほとんどまたはまったくない状態で突然終了した場合(つまり、Cでabortを呼び出すか、C ++で終了した場合)はどうなるでしょうか。

  • OSがミューテックスのロックを解除するという保証はありますか?それとも、ほとんどの信頼できるシステムが(解放されていないメモリと同様に)ロックを解除することを意味しますか?

  • 保証がない場合、これにより、まだ実行中のプロセスとデッドプロセスによって保持されているロックの間に実際にデッドロックが発生する可能性がありますか?

  • この方法でデッドロックを作成できる場合、個別のプロセス間で共有されるミューテックスを介してではなく、プロセスのスレッド間でデッドロックを複製できますか?

4

1 に答える 1

6

mutexオブジェクトが既存のプロセスで所有されていた場合(createまたはopenのいずれかによって)、プロセスの終了時にそのハンドルが閉じられます。

他のプロセスの待機操作は、次のような場合に戻ります。

Windowsの場合、つまり、次のことを意味しますWaitForSingleObject(...)WAIT_ABANDONED

指定されたオブジェクトは、所有しているスレッドが終了する前に、ミューテックスオブジェクトを所有していたスレッドによって解放されなかったミューテックスオブジェクトです。ミューテックスオブジェクトの所有権は呼び出し元のスレッドに付与され、ミューテックス状態は非シグナリングに設定されます。ミューテックスが永続的な状態情報を保護していた場合は、整合性を確認する必要があります。

Linuxの場合、つまり、次のことを意味しますpthread_mutex_lock(...)EINVAL

mutexで指定された値は、初期化されたmutexオブジェクトを参照していません。

于 2012-10-28T17:01:44.430 に答える