2017-06-19 16 views
-1

私はこの問題を先に進めようとしていますが、私の誤りではないようです。十分な大きさなので、コードを投稿することはできません。私はそれを私ができるほど良く説明しようとします。 まず、multithreaded server applicationで、複数のクライアントから同時にリクエストを受け取り、AF_UNIXソケットを持つマスターワーカー(スレッドのプール)スタイルを使用して詳細を調べます。 それは多くの場合、このエラーを返す実行している間:Pthread mutexロックアサーションが失敗します

を[名前]:../nptl/pthread_mutex_lock.c:81:__pthread_mutex_lock:アサーション `ミューテックス - > __データ.__オーナー== 0' に失敗しました。

私はこのエラーを複製するか、valgrindまたはgdb(これは何度か試しました)でキャッチすることができません。 PTHREAD_MUTEX_INITIALIZERで初期化されたいくつかのグローバルpthread_mutex_tを使用し、を無効にすることはありません。何かが失敗し、私はスレッドから返すようにした場合

  1. pthread_mutex_lock(&mutex);
  2. ::他pthread_mutex_unlock(&mutex);return (void*) -1;
  3. :私はこのようなコードの周りに安全にロックし、ロックを解除してかなり確信して物事共有変数
  4. pthread_mutex_unlock(&mutex);

と私はそれがに低いレベルの競合状態が原因で発生することがあることを読みましたファイルですが、わかりません。 ところで、私はこのアサーションが失敗する理由を理解するだろう総称

+0

はい関数呼び出しが失敗する前にロックを保持していれば、ロックを解除して戻ります。私はエントリでロックをつかまえませんが、私はそれが必要な場所です。はい、 'pthread_join'の' void * 'に' -1'をキャストします。 – BetaRunner

+0

自分が所有しているロックを解放しましたスレッドが削除されない場合はいいですか? – BetaRunner

+0

私はチェックしないで、通常のpthreadミューテックスを使用します。すべてのスレッドはロックしようとし、取得した後、いくつかのことを行い、解放します。 – BetaRunner

答えて

3

これは、通常、ロックが何らかの方法で壊れていることを示します。 1つの可能性は、初期化されていないか、すでに破棄され再初期化されていないロックをロックしようとしていることです。もう1つの可能性は、他のコードが、おそらく境界外の配列にアクセスしたり、解放された後にメモリにアクセスしたりして、ミューテックス上でストンプすることです。

+0

おそらく、彼はそのスレッドがロックしていないミューテックスのロックを解除しようとしているスレッドを持っているか、すでにロックしている非再帰的なものをロックしようとしています。 –

+1

@JohnBollingerは、私は別のエラーが発生していると思ったが、今私はそれを見ていることを、私はあなたが正しいと思う - このエラーは、すでに保持しているロックを取得しようとしているスレッドによって製造することができます。 –

+0

私はすでにpthread_mutex_normalを使用しています。すべてのスレッドはpthread_lock_acquireを実行して、既にロックされていてもロックを取得します。それって問題ですか? – BetaRunner

関連する問題