問題:
スレッドセーフ キューの実装中に、空のキューからデキューするときにセグメンテーション違反が発生しました。この問題は、通知された場合にのみ返されることが期待されていた条件変数 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 を返し、空のキューからデキューしようとするのを防ぎます。
追加の推奨事項:
以上が空のキューからデキューすると、C 11 スレッド セーフ キューでセグメンテーション違反が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。