동일한 조건 변수에서 시간 제한 대기 및 무한 대기?

AdeleGoldberg

시나리오 :
나는이 condition_variable 기반 대기 및 신호 메커니즘을. 작동합니다! 그러나 저는 고전적인 대기 및 신호 메커니즘 이상의 것이 필요합니다. 나는 "동시에 condition_variable" 무한한 기다릴뿐만 아니라 시간 제한을 기다릴 수 있어야한다 . 따라서 condition_variable가짜 깨우기 문제도 처리 하는 래퍼 클래스를 만들었 습니다. 다음은 이에 대한 코드입니다.

암호:

// CondVarWrapper.hpp
#pragma once
#include <mutex>
#include <chrono>
#include <condition_variable>

class CondVarWrapper {
public:
    void Signal() {
        std::unique_lock<std::mutex> unique_lock(cv_mutex);
        cond_var_signalled = true;
        timed_out = false;
        unique_lock.unlock();
        cond_var.notify_one();
    }

    bool WaitFor(const std::chrono::seconds timeout) {
        std::unique_lock<std::mutex> unique_lock(cv_mutex);
        timed_out = true;
        cond_var.wait_for(unique_lock, timeout, [this] {
            return cond_var_signalled;
        });
        cond_var_signalled = false;
        return (timed_out == false);
    }

    bool Wait() {
        std::unique_lock<std::mutex> unique_lock(cv_mutex);
        timed_out = true;
        cond_var.wait(unique_lock, [this] {
            return cond_var_signalled;
        });
        cond_var_signalled = false;
        return (timed_out == false);
    }

private:
    bool cond_var_signalled = false;
    bool timed_out  = false;
    std::mutex  cv_mutex;
    std::condition_variable cond_var;
};


// main.cpp
#include "CondVarWrapper.hpp"
#include <iostream>
#include <string>
#include <thread>

int main() {
   CondVarWrapper cond_var_wrapper;

   std::thread my_thread = std::thread([&cond_var_wrapper]{
       std::cout << "Thread started" << std::endl;
        if (cond_var_wrapper.WaitFor(std::chrono::seconds(10))) {
            std::cout << "Thread stopped by signal from main" << std::endl;
        } else {
            std::cout << "ERROR: Thread stopping because of timeout" << std::endl;
        }
    });

   std::this_thread::sleep_for(std::chrono::seconds(3));
   // Uncomment following line to see the timeout working
   cond_var_wrapper.Signal();
   my_thread.join();
}

질문 :
위의 코드는 좋지만 한 가지 문제가 있다고 생각합니까? 내가 정말 할 수 있을까 wait잘 할뿐 wait_for동일한에 condition_variable? 스레드가 cv_mutex호출에 의해 획득 되고 CondVarWrapper::Wait()어떤 이유로이 스레드가 반환되지 않으면 어떻게 될까요? 그런 다음 다른 스레드가 CondVarWrapper::WaitFor(std::chrono::seconds(3))3 초 내에 성공하지 못하면 반환 될 것으로 예상하여 호출 합니다. 자,이 두 번째 쓰레드는 WaitFor3 초 후에 돌아올 수 없습니다 . 사실 그것은 결코 돌아 오지 않을 것입니다. 때문에 condition_variable대기가 시간 제한 대기 아니라에 대한 잠금입니다 cv_mutex. 내가 맞습니까, 아니면 여기서 이해가 틀렸습니까?

위의 내용이 정확하면 std::mutex cv_mutexa 로 교체 std::timed_mutex cv_mutex하고 timed_wait를 CondVarWrapper::WaitFor수행하고 무한 대기를 수행해야 CondVarWrapper::Wait합니까? 아니면 더 나은 / 쉬운 처리 방법이 있습니까?

마이크 반 다이크

std::condition::wait조건 변수를 호출하면 뮤텍스가 해제됩니다 cond_var. 따라서 CondVarWrapper::Wait한 스레드에서 호출 할 때 호출 할 때 뮤텍스를 해제하고 std::condition::wait거기에 영원히 멈추고 두 번째 스레드는 여전히 CondVarWrapper::WaitFor뮤텍스를 호출 하고 성공적으로 잠글 수 있습니다 cv_mutex.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

시간에 대한 조건 제공

분류에서Dev

python / pygame에서 조건문에 대한 대기 시간을 얻는 방법

분류에서Dev

대화 조각 및 활동보기에 대한 터치 해제

분류에서Dev

동일한 열에 대한 MYSQL 기본 조건부 집계

분류에서Dev

Treadpool : 풀 크기를 결정하기위한 대기 시간 및 실행 시간에 대한 간단한 예

분류에서Dev

날짜 및 시간에 대한 GMT 시간 가져 오기

분류에서Dev

Firebase 실시간 데이터베이스 요청에 대한 조건 및 제한 지정

분류에서Dev

일정 기간 동안 동일한 간격 내에서 최소 및 최대에 대한 느린 PostgreSQL 쿼리

분류에서Dev

요일, 시간대 및 횟수에 대한 iOS 로컬 알림 기반?

분류에서Dev

파일에 대한 동시 읽기 및 쓰기와 관련된 문제는 무엇입니까?

분류에서Dev

SQL OrderBy 및 ThenBy에 대한 조건 기반 Linq

분류에서Dev

OR 및 AND 조건에 대한 PHP 쿼리 작성기

분류에서Dev

기존 제약 조건에 대한 SQL 코드 자동 생성

분류에서Dev

제한 시간이있는 조건 변수 대기 중 : 시간 내에 잠금이 다시 획득되지 않음

분류에서Dev

매개 변수 및 값에 대한 파일 읽기-> 특정 행 건너 뛰기

분류에서Dev

COUNT에 대한 조건부 만들기

분류에서Dev

COUNT에 대한 조건부 만들기

분류에서Dev

요인에 대한 조건부 기록

분류에서Dev

셀에서보기에 대한 제약 조건 추가 버그

분류에서Dev

Selenium : WebElement를 사용한 명시 적 대기에 대한 예상 조건

분류에서Dev

재귀에 대한 지식의 갭 수정 : 기본 조건 및 상태

분류에서Dev

jquery에서 표시 / 숨기기에 대한 동일한 버튼

분류에서Dev

플러시에 대한 여러 제약 조건 위반 및 단일 트랜잭션에서 지속

분류에서Dev

기본 클래스 및 인터페이스에 대한 C # 제네릭 제약 조건

분류에서Dev

주어진 과정에 대한 모든 전제 조건 찾기

분류에서Dev

동일한 열 및 순서에 대해 다중 조건으로 선택

분류에서Dev

IF SQL의 INSERT 및 UPDATE에 대한 조건

분류에서Dev

bash 명령 및 기능에 대한 시간 제한을 구현하는 우아한 솔루션

분류에서Dev

'and'및 'or'조건을 포함한 여러 조건에 대한 Grepl 일치

Related 관련 기사

  1. 1

    시간에 대한 조건 제공

  2. 2

    python / pygame에서 조건문에 대한 대기 시간을 얻는 방법

  3. 3

    대화 조각 및 활동보기에 대한 터치 해제

  4. 4

    동일한 열에 대한 MYSQL 기본 조건부 집계

  5. 5

    Treadpool : 풀 크기를 결정하기위한 대기 시간 및 실행 시간에 대한 간단한 예

  6. 6

    날짜 및 시간에 대한 GMT 시간 가져 오기

  7. 7

    Firebase 실시간 데이터베이스 요청에 대한 조건 및 제한 지정

  8. 8

    일정 기간 동안 동일한 간격 내에서 최소 및 최대에 대한 느린 PostgreSQL 쿼리

  9. 9

    요일, 시간대 및 횟수에 대한 iOS 로컬 알림 기반?

  10. 10

    파일에 대한 동시 읽기 및 쓰기와 관련된 문제는 무엇입니까?

  11. 11

    SQL OrderBy 및 ThenBy에 대한 조건 기반 Linq

  12. 12

    OR 및 AND 조건에 대한 PHP 쿼리 작성기

  13. 13

    기존 제약 조건에 대한 SQL 코드 자동 생성

  14. 14

    제한 시간이있는 조건 변수 대기 중 : 시간 내에 잠금이 다시 획득되지 않음

  15. 15

    매개 변수 및 값에 대한 파일 읽기-> 특정 행 건너 뛰기

  16. 16

    COUNT에 대한 조건부 만들기

  17. 17

    COUNT에 대한 조건부 만들기

  18. 18

    요인에 대한 조건부 기록

  19. 19

    셀에서보기에 대한 제약 조건 추가 버그

  20. 20

    Selenium : WebElement를 사용한 명시 적 대기에 대한 예상 조건

  21. 21

    재귀에 대한 지식의 갭 수정 : 기본 조건 및 상태

  22. 22

    jquery에서 표시 / 숨기기에 대한 동일한 버튼

  23. 23

    플러시에 대한 여러 제약 조건 위반 및 단일 트랜잭션에서 지속

  24. 24

    기본 클래스 및 인터페이스에 대한 C # 제네릭 제약 조건

  25. 25

    주어진 과정에 대한 모든 전제 조건 찾기

  26. 26

    동일한 열 및 순서에 대해 다중 조건으로 선택

  27. 27

    IF SQL의 INSERT 및 UPDATE에 대한 조건

  28. 28

    bash 명령 및 기능에 대한 시간 제한을 구현하는 우아한 솔루션

  29. 29

    'and'및 'or'조건을 포함한 여러 조건에 대한 Grepl 일치

뜨겁다태그

보관