C 11 スレッド セーフ キュー: 理解とデバッグ
スレッド セーフ キューの実装でセグメンテーション フォールトが発生しました。 dequeue() 関数、特にキューが空の場合。この異常は、待機条件 wait_for(lock, timeout) が偽のウェイクアップを処理するように適切に構造化されていないために発生します。
偽のウェイクアップについて
条件変数PopulatedNotifier と同様に、実際の通知が発生することなく起動される、偽のウェイクアップが発生する可能性があります。この動作は、基礎となるマルチスレッド実装に固有のものであり、予測できない場合があります。
条件の修正
潜在的に信頼性の低い通知に依存することを避けるため、ベスト プラクティスでは、次の逆を使用することが指示されます。 dequeue() および同様の関数の while ループの基礎として必要な条件: while (!condition)。このループ内:
実装例
ここにありますdequeue() 関数の改訂版:
std::unique_lock<:mutex> lock(qMutex);
while (q.empty()) {
c.wait(lock);
if (q.empty()) { // Immediately check the condition again after acquiring the lock
return std::string();
}
}
std::string ret = q.front();
q.pop();
return ret;
これらのガイドラインに従うことで、待機状態が堅牢で誤ったウェイクアップの影響を受けにくくなり、セグメンテーション違反の問題を効果的に解決できます。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3