2011-09-14 22 views
8

スレッドがpthread_mutex_lockを正常に呼び出すと仮定すると、同じスレッド内のpthread_mutex_unlockへの呼び出しが失敗する可能性はありますか?もしそうなら、スレッドを中止する以外に実際に何かすることができますか? this pageからpthread_mutex_unlockの失敗をどうやって処理しますか?

if(pthread_mutex_lock(&m) == 0) 
{ 
    // got the lock, let's do some work 

    if(pthread_mutex_unlock(&m) != 0) // can this really fail? 
    { 
     // ok, we have a lock but can't unlock it? 
    } 
} 

pthread_mutex_unlock()のための可能なエラーは、次のとおり

[EINVAL] ミューテックスで指定された値が初期化 ミューテックスオブジェクトを参照しません。

ロックが成功した場合、これは失敗しないでしょう。

ミューテックスため 再帰的ロックの最大数を超えたため、[EAGAIN] ミューテックスを取得することができませんでした。

本当に?ロックを解除するには?

[EPERM] 現在のスレッドがミューテックスを所有していない:場合

pthread_mutex_unlockの()関数が失敗することがあります。再び

ロックが成功した場合、これはまた、発生しません。

だから、私の考えは、成功したロックは、このような状況で、その後がある場合は、アンロックは、エラーチェックとその後の処理コードは無意味作る失敗することはありませんです。あなたはmanページを信じるならば、あなたのエラーケースが発生することができないように思わ

The pthread_mutex_unlock() function may fail if: 

EPERM 
The current thread does not own the mutex. 

These functions shall not return an error code of [EINTR]. 

:pthread_mutex_unlockのためのmanページから

答えて

2

+0

ありがとう、それは私の考えと同様です。私はなぜ質問しているのかをもっと明確にするために質問を更新しました。私は答えを受け入れる前に他の入力を得ることができるかどうかを知りたい。 –

2

あなたが「勝利」を叫ぶ前に。私はこのページで、私のプログラムの1つがpthread_mutex_unlock(LinuxではなくHP-UX上)で失敗した理由を探しました。

if (pthread_mutex_unlock(&mutex) != 0) 
    throw YpException("unlock %s failed: %s", what.c_str(), strerror(errno)); 

これは、数百万回の幸福な処刑の後、私には失敗しました。 errnoはEINTRでしたが、私は今、errnoをチェックするべきではなく、戻り値をチェックすべきであることを知りました。それにもかかわらず、戻り値は0ではありませんでした。そして、私はその場所で有効なロックを所有していることを数学的に証明することができます。

あなたの理論はストレス下にあると言いましょう。多くの研究が必要ですが、

+0

恐ろしい!またはおそらく素晴らしいではないでしょうか。 :-)これはちょうど私が探しているフィードバックの種類です。あなたはこのエラーを再現することができますか、それは一度のことでしたか? 'pthread_mutex_unlock()'が 'errno'などで' EINTR'を返すことが想定されていないので、実際の戻り値が何であったかは興味深いでしょう。 –

+0

私はそれを再現できませんでした。私は実際の戻り値を表示するようにロギングを修正しました。それが起こる次回は(私はないと思い)私はあなたがそれが;-) – geert3

+2

リトル更新した内容を正確に把握できるようになる:私は「未所有者」を意味し、失敗したアンロック、戻り値== 1のスプリアスの発生を持ってきました。これは非常に微妙なバグであることが判明しました。 私は(デストラクタがロック解除する)オブジェクト内のすべての私のロックを包みます。これは、オブジェクトの有効範囲とともに自動的にロックが終了するので便利です。 この関数では、thread_exit()を呼び出していました。 manページには、thread_exit()の後に自動変数を使用できないと書かれています。これはまさに私のロックラッピングオブジェクトのデストラクタがやっていたことです(暗黙的にAFTER thread_exitと呼ばれています)。 – geert3

関連する問題