2010-12-12 8 views
15

スレッドが2つあり、メインスレッドとスレッドB(メインによって作成されたスレッド)があるとします。 Bがmutexを取得した場合(pthread_mutexなど)、ロックを解除せずにpthread_exitを呼び出しています。では、ミューテックスはどうなりますか?それは無料になりますか?Mutexを取得したスレッドが終了するとどうなりますか?

答えて

14

nope。ミューテックスはロックされたままです。実際に何が、このようなロックに起こることは、その種類によって異なり、あなたはpthread_mutex_initを呼び出す前に、右の属性を設定することで堅牢なミューテックスを作成した場合hereまたはhere

+0

Merci Beaucoup !!!どうもありがとう !!! – Sadish

+0

堅牢なミューテックスでない限り、別のスレッドはロックを解除できません。 –

+0

Whoa、スレッドアフィニティを持たない「mutex」? 「放棄された」エラーステータスはありませんか? –

10

は、ミューテックスをする際、特別な状態に入ることについて読むことができますロックを保持しているスレッドは終了し、次のスレッドはmutexを取得しようとするとEOWNERDEADというエラーが発生します。 mutexが保護している状態をクリーンアップし、pthread_mutex_consistentを呼び出してmutexを再度使用可能にするか、またはpthread_mutex_unlockを呼び出します(mutexを永久に使用できないようにします;それ以降の使用はENOTRECOVERABLEを返します)。

堅牢ではないミューテックスの場合、ロックされたスレッドがロックを解除せずに終了すると、ミューテックスは永続的に使用できなくなります。標準(オースティン・グループ・トラッカーのissue 755への解決策を参照)では、mutexはロックされたままであり、その正式な所有権は引き続き終了したスレッドに属し、ロックしようとするスレッドはデッドロックします。別のスレッドがロックを解除しようとした場合、muttがPTHREAD_MUTEX_ERRORCHECK属性で作成されていない限り、通常は未定義の動作です。この場合、エラーが返されます。

一方、実際の実装の多くは、実際には標準の要件を満たしていません。所有権を追跡するために使用されたスレッドIDが再利用された可能性があり、別のスレッド(おそらく新しいロック/アンロック要求を行うスレッド)を参照する可能性があるため、別のスレッドからmutexをロックまたはロック解除しようとすると、少なくともglibcのNPTLはこの動作を示すことが知られています。

関連する問題