문제:
스레드로부터 안전한 대기열을 구현하는 동안, 빈 대기열에서 대기열을 빼낼 때 segfault가 발생했습니다. 이 문제는 알림을 받은 경우에만 반환될 것으로 예상되는 조건 변수 wait_for 함수에서 발생했습니다. 그러나 wait_for 함수가 cv_status::no_timeout과 함께 반환된 후 대기열이 비어 있는 경우가 있습니다.
해결책:
올바른 접근 방식은 조건에 의해 모니터링되는 조건을 반전시키는 것입니다. 변하기 쉬운. 이 경우 원하는 조건은 대기열에 요소가 하나 이상 있어야 하기 때문에 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 스레드 안전 대기열 Segfault가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!