ホームページ  >  記事  >  バックエンド開発  >  空のキューからデキューすると、C 11 スレッド セーフ キューでセグメンテーション違反が発生するのはなぜですか?

空のキューからデキューすると、C 11 スレッド セーフ キューでセグメンテーション違反が発生するのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-30 20:34:02783ブラウズ

Why Does My C  11 Thread-Safe Queue Segfault When Dequeuing from an Empty Queue?

C 11 条件変数を使用したスレッドセーフ キューの実装

問題:

スレッドセーフ キューの実装中に、空のキューからデキューするときにセグメンテーション違反が発生しました。この問題は、通知された場合にのみ返されることが期待されていた条件変数 wait_for 関数に起因していました。ただし、wait_for 関数が cv_status::no_timeout を返した後、キューが空のままになることがありました。

解決策:

正しいアプローチは、条件によって監視される条件を反転することです。変数。この場合、キューに少なくとも 1 つの要素があることが望ましい条件であるため、q.empty() を !q.empty() に反転する必要があります。変更されたデキュー メソッドは次のとおりです。

<code class="cpp">std::string FileQueue::dequeue(const std::chrono::milliseconds& timeout)
{
    std::unique_lock<std::mutex> lock(qMutex);
    while (q.empty()) {
        if (populatedNotifier.wait_for(lock, timeout) == std::cv_status::timeout) {
            return std::string();
        }
    }
    std::string ret = q.front();
    q.pop();
    return ret;
}</code>

現在、wait_for 関数は、タイムアウト期間後にキューが空のままである場合にのみ cv_status::timeout を返し、空のキューからデキューしようとするのを防ぎます。

追加の推奨事項:

  • 再利用可能なスレッドセーフ キューにはテンプレートを使用します。
  • インラインではなくクラスのコンストラクターでキューを初期化します。
  • std::unique_lock を優先して std::lock_guard の使用を避けてください。これにより、クリティカル セクション内で例外がスローされた場合でもミューテックスのロックが確実に解除されます。

以上が空のキューからデキューすると、C 11 スレッド セーフ キューでセグメンテーション違反が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。